Pull to refresh

Comments 58

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

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

Есть стандарт, в нём NaN — число. Так сделали специально, чтобы получить непротиворечивую алгебру, это нормально.
UFO just landed and posted this here
крайне неочевидная с точки зрения обычных людей
А что обычным людям делать в программировании?

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

Что вас тут, интересно, смущает? Вы хотели какого-то другого поведения? Чем оно может быть полезно какому-либо языку?
UFO just landed and posted this here
Я промотал. Там нет разъяснения.

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

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

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

0===-2+2 // true
Такой пример понятнее?
UFO just landed and posted this here
А какого типа вы бы сделали 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 в его блоге описана.
Ой. Неудобно перед Алленом, читал его пост по диагонали.
Sign up to leave a comment.

Articles