Ответ 1
"Отсеки веток для сложных элементарных функций или много шума из ничего не значат" объясняет причины подписанных нулей. Такой анализ сообщил IEEE-754, который является основой для большинства современных наборов инструкций и поведение языков с плавающей запятой языков программирования.
Вкратце, многие обычные числовые функции могут быть непрерывными с подписанными нулями в местах, где они не могут быть с беззнаковым нулем, что приводит к меньшему числу NaN
и меньшему числу особых случаев. Подразделение - одна из таких функций.
Тогда возникает вопрос: почему -0 обрабатывается отдельно, чем 0 и +0?
Чтобы быть ясным, есть только два нулевых значения. -0 и +0. Токены (0)
могут быть заменены маркерами (+0)
, где бы они ни происходили, без изменения семантики.
Интересным фактом является то, что 0 равно -0
0 === -0 true
Такое поведение предусмотрено IEEE-754.
Чтобы проверить, являются ли два числовых значения "одинаковыми":
function same(x, y) {
if (x === y) {
if (x !== 0) {
return true; // Non-zero values.
} else {
return (1/x === 1/y); // Test signed-ness of zeroes.
}
} else {
return x !== x && y !== y; // Treat NaNs the same
}
}