О приоритетах-2

Jan 10, 2024 13:28


Оказывается, в Microsoft Excel приоритет унарного минуса выше всего на свете, и поэтому -x*x - это (-x)*(x), а -x^2 - это (-x)^2, то есть результаты закономерно разные. john-jack утверждает, что это вообще всегда так и должно быть очевидно каждому программисту, но мой опыт протестует.
Давайте проверим.
Для начала - легендарный GW-BASIC, из которого вырос ( Read more... )

бред, excel, ЭВМ, обмен опытом

Leave a comment

Comments 26

polosatiy81 January 10 2024, 10:49:11 UTC

Javascript
-x*x == -4
-x**2 - SyntaxError, необходимы скобки для правильного вычисления

Reply

hardsign January 10 2024, 10:54:43 UTC
Офигеть.
Какое счастье, что я не пишу на JavaScript...

Reply

polosatiy81 January 10 2024, 11:40:43 UTC

Ну в целом, это можно было бы принять за заботу о пользователе, раз в разных языках оно выполняется по разному, то в явном виде писать (-х)**2 и -(х**2) - выглядит неплохой идеей)

Если конечно забыть о том, какие интересные результаты можно получать за счет крайне неочевидного приведения типов в операциях. И вишенкой на торте, одновременно с запретом -х**2, выражение --х**2 - вполне себе валидное в js)

Reply

ackforstpdcmnts January 12 2024, 10:15:09 UTC
А я в шоке от того, что джаваскрипт такой педант. Я думал, он как Питон: сожрет всё, а ты потом сиди думай, почему он понял тебя именно так.

Reply


hardsign January 10 2024, 10:50:37 UTC
Начну комментировать себя сам. Pascal:

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


kspshnik January 10 2024, 10:56:01 UTC

В общем, оказывается ув. iv_an_ru был абсолютно прав про баг, и авторы Excel недокурили учебник арифметики (Ричмонд, чо там). Признаю свою неправоту - математикой -x2 интерпретируется как -1 * x2, а вовсе не как (-x)2.

И Вы, ув. hardsign, абсолютно правы - бардак-с с приоритетами :)

Reply


hardsign January 10 2024, 11:30:39 UTC
И ещё один камент себе:

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


v_pychick January 10 2024, 11:56:19 UTC
пых:

$x=2;
echo " -x * x = ".(-$x*$x).", -x ^ 2 = ".(-$x^2);

-----
-x * x = -4, -x ^ 2 = -4

Reply

hardsign January 10 2024, 12:05:13 UTC
Grazie mille!

Reply


Leave a comment

Up