Оказывается, в Microsoft Excel приоритет унарного минуса выше всего на свете, и поэтому -x*x - это (-x)*(x), а -x^2 - это (-x)^2, то есть результаты закономерно разные.
john-jack утверждает, что это вообще всегда так и должно быть очевидно каждому программисту, но мой опыт протестует.
Давайте проверим.
Для начала - легендарный GW-BASIC, из которого вырос
(
Read more... )
Comments 26
Javascript
-x*x == -4
-x**2 - SyntaxError, необходимы скобки для правильного вычисления
Reply
Какое счастье, что я не пишу на JavaScript...
Reply
Ну в целом, это можно было бы принять за заботу о пользователе, раз в разных языках оно выполняется по разному, то в явном виде писать (-х)**2 и -(х**2) - выглядит неплохой идеей)
Если конечно забыть о том, какие интересные результаты можно получать за счет крайне неочевидного приведения типов в операциях. И вишенкой на торте, одновременно с запретом -х**2, выражение --х**2 - вполне себе валидное в js)
Reply
Reply
program minus;
operator ** (x : Integer; y : integer) z : integer;
var
i :integer;
begin
z := x;
for i := 1 to y-1 do z := z*x;
end;
var x :ShortInt;
begin
x := 2;
writeln ('-x*x = ',-x*x,', -x^2 = ',-x**2);
end.
1 января 2024 года скончался Никлаус Вирт. Покойся с миром, Мастер. А код выдаёт то, что и должен - оба раза -4.
Reply
В общем, оказывается ув. iv_an_ru был абсолютно прав про баг, и авторы Excel недокурили учебник арифметики (Ричмонд, чо там). Признаю свою неправоту - математикой -x2 интерпретируется как -1 * x2, а вовсе не как (-x)2.
И Вы, ув. hardsign, абсолютно правы - бардак-с с приоритетами :)
Reply
SQL# select -id*id as mult, -id^2 as exp from sample where id=2;
mult | exp
------+-----
-4 | 4
PostgreSQL выдаёт разные значения, а в Oracle, MySQL и Microsoft SQL Server оператора возведения в степень нет.
Reply
$x=2;
echo " -x * x = ".(-$x*$x).", -x ^ 2 = ".(-$x^2);
-----
-x * x = -4, -x ^ 2 = -4
Reply
Reply
Leave a comment