Как стать автором
Обновить

Комментарии 58

Вы действительно считаете, что для программиста знать основы представления числа с плавающей точкой (в том числе про отрицательный ноль) — глубокие познания?
Я иронично. Не нашел красненький. Но в целом, знание фронтенд-программистом/верстальщиком особенностей стандарта IEEE 754, поведения функции atan2 в граничных случаях и деления на -0 — да, считаю достаточно глубокими познаниями.
Ну, верстальщик и не должен с этим сталкиваться, имхо. И особенностей никаких нет: и поведение atan2 и деление на -0 вытекают из этих основ (а не особенностей) стандарта IEEE 754, как в том числе указано гражданином toxicdream ниже
А так да, если иронично, то простите, недопонял)
простите, для javascript программиста
НЛО прилетело и опубликовало эту надпись здесь
Вот этот URL — позор программистов. Туда постят те, кто не читал стандарта и, наверное, не подозревает, что у языка он есть.

Учатся «на примерах», а потом всё у них «нелогично» работает.
НЛО прилетело и опубликовало эту надпись здесь
Это логично. Откройте для себя стандарт IEEE_754. NaN — число. Infitity — число. -Infinity — число.
НЛО прилетело и опубликовало эту надпись здесь
А вас не смущает, что typeof Infinity тоже number? Напоминаю, что в математике бесконечность — понятие, а не число.

Есть стандарт, в нём NaN — число. Так сделали специально, чтобы получить непротиворечивую алгебру, это нормально.
НЛО прилетело и опубликовало эту надпись здесь
крайне неочевидная с точки зрения обычных людей
А что обычным людям делать в программировании?

Программистов не смущает, что есть значение undefined, то есть отсутствие значения. Ещё есть null, тоже значение отсутствует.
Если человек считает, что он понимает принцип работы чисел с плавающей запятой, — это уже не обычный человек.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
если бы не одна маленькая деталь: 0 === -0 // => true

Что вас тут, интересно, смущает? Вы хотели какого-то другого поведения? Чем оно может быть полезно какому-либо языку?
НЛО прилетело и опубликовало эту надпись здесь
Я промотал. Там нет разъяснения.

Это хороший стандарт. Если вам это непонятно, то попробуйте провести мысленный эксперимент: изменить всё, что вам не нравится в нём, а потом попрограммируйте (тоже мысленно) на получившимся языке.
НЛО прилетело и опубликовало эту надпись здесь
Вы что-то понимаете в языках? Изучали компиляторы и интерпретаторы? Много ли языков смотрели?

Кроме того вы уже ниже признали, что сглупили.
НЛО прилетело и опубликовало эту надпись здесь
Я попробовал в действии более 50 языков. Не во всех разбирался детально, просто потому что многие из них сильно похожи. Я в этом понимаю. JS — хороший язык.

С чего вы взяли, что это я минусы вам ставлю? Я этим вообще редко занимаюсь. Я даже не в курсе на что они влияют, если честно.
«-» это тоже оператор.
сначала выполняется он — -0 = 0, а потом уже сравнение идет.
0 === 0. разве нет?

0===-2+2 // true
Такой пример понятнее?
НЛО прилетело и опубликовало эту надпись здесь
А какого типа вы бы сделали NaN? Что по вашему логично?
А какой вообще физический… вернее, геометрический смысл операции atan2(0, 0)?
Арктангенс?
Точнее смысл определения угла при предельном стремлении x и y к нулям (плюс-минус)
Так все дело в том, что функция atan2 при стремлении x и y к нулю хоть с положительной, хоть с отрицательной стороны предела не имеет.
Никакого. Нужно возвращать NaN, как при 0/0
Не надо.
> Math.atan2(0, -0) // => 3.141592653589793
> Math.atan2(-0, -0) // => -3.141592653589793

Арктангенсы от двух разных чисел не совпадают. Какая неожиданность!
> Math.acos(-0) // => 1.5707963267948966
> Math.acos(0) // => 1.5707963267948966

Тут ничего неожиданного?
Мне кажется, или в какой-то момент арктангенс превратился в арккосинус, а плюс и минус бесконечности — в плюс и минус ноль?
Ну, технически два нуля в atan2 — это всё-таки не бесконечности, конечно, но это явно связано.
Вы утверждаете, что «ничего неожиданного», что арктангенсы двух разных чисел не совпадают. Я вам показываю арккосинусы двух разных чисел, они совпадают.
Ой, а давайте оценим, насколько более вероятно ожидается, что арккосинусы двух произвольных разных чисел (ладно, на диапазоне −1 ≤ x ≤ 1) не совпадают, чем то, что они совпадают ;)?
Ой, а я не хочу.

Кончайте троллить. Вы почему-то решили, что atan2(-0, -0) != atan2(0, 0) — это ожидаемо (просто из того факта, что числа разные), а почему это не распространяется на любые другие функции?

И вообще, вы до этого момента задумывались о существовании минус нуля в языках программирования?
> Вы почему-то решили, что atan2(-0, -0) != atan2(0, 0) — это ожидаемо (просто из того факта, что числа разные), а почему это не распространяется на любые другие функции?

Потому что, вестимо, далеко не любые другие функции являются функцией atan2.

> И вообще, вы до этого момента задумывались о существовании минус нуля в языках программирования?

Это скучно. А вы когда-нибудь задумывались, является ли нечисло числом? Если парсер тут ссылку вырежет, то вставьте в адресную строку javascript:alert(typeof NaN)
Видимо, потому что это стандарт, который придумали задолго до Javascript/
Это скучно. А вы когда-нибудь задумывались, является ли нечисло числом? Если парсер тут ссылку вырежет, то вставьте в адресную строку javascript:alert(typeof NaN)
Вот это точно скучно. Конечно, это число. По стандарту, который упомянут в теле заметки.
Потому что, вестимо, далеко не любые другие функции являются функцией atan2.
То ли я вас не понимаю, то ли вы меня. Думаю, замнём.
Подсознание мне подсказывает, что, если бы ожидалось, что для любой пары аргументов функции значения функции совпадают, то функция была бы очень похожа на константу. По крайней мере, мощность множества одинаковых значений должна быть больше мощности любых отличающихся значений.
Подсознание мне подсказывает, что если не знать о существовании отрицательного нуля, то поведение atan2(-0, -0) будет сюрпризом. Заметка именно об этом.
функция арккосинуса в нуле непрерывна, а у арктангенса — разрыв второго рода, так что всё правильно.
> а у арктангенса — разрыв второго рода
Даааа?

Тут речь скорее про то, что atan2(0, 0) — это далеко не atan(0). atan2 — это вот такая красотень (интересно, картинка прямо с Wolfram Alpha подхватится?...):
Перепутал с тангенсом — очень давно с ними дело имел последний раз.
Ну а на картинке что, не разрыв?
А на картинке разрыв, да. И теперь вроде даже определились, про какой арктангенс идёт речь :)
Функция арктангенса в точке ноль терпит разрыв, а значение в ней не существует. atan2 — Это арктангенс, дополненный предельными значениями слева (для -0) и справа (для +0). Соответственно в пределе слева и справа эта функция стремиться к разным значениям.
atan2 сделана для удобства, чтобы не делать лишних проверок в программе. С точки зрения математики и арифметики с плавающей запятой поведение ее абсолютно логично.
Кроме того, поскольку период тригонометрических функций Pi/2, то если вас не устраивают отрицательные углы, всегда можно сделать проверку

angle=atan2(val);
if (angle<0) angle+=pi/2;


Это тоже будет корректно.
Извините, ошибся:
angle=atan2(val);
if (angle<0) angle+=pi*2;
Во-первых, у арктангенса в нуле разрыва нет. atan(0) = 0
Во-вторых, у функции atan2 два аргумента, а не один. И похоже, вы не совсем правильно представляете себе ее смысл.
Вы правы, я совершенно заблуждался по поводу atan2. А ведь был так уверен… )
Как это никакой практической пользы? Это можно использовать, например, в обфускаторах.
Я достаточно давно программирую на javascript, но никогда не думал про -0.
Было интересно почитать в плане собственного развития. Спасибо :)
некий Аллен Вирфс-Брок

Так, к слову, Allen Wirfs-Brock — один из участников TC-39 (technical committee 39) — группа людей занимающаяся стандартом ECMA-262.

А вообще, приведенный код в этом топике, это не его версия, а Dave Herman'a (он тоже из TC-39). Версия Allen'a в его блоге описана.
Ой. Неудобно перед Алленом, читал его пост по диагонали.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории