Почему числа с плавающей запятой имеют подписанные нули?

Почему удвоения имеют -0, а также +0? Каков фон и значение?

Ответ 1

-0 (обычно) рассматривается как 0 *******. Это может произойти, когда отрицательное число с плавающей запятой настолько близко к нулю, что его можно считать 0 (чтобы быть ясным, я имею в виду арифметическое недополнение, а результаты следующих вычислений интерпретируются как точно ±0, а не только очень маленькие числа). например.

System.out.println(-1 / Float.POSITIVE_INFINITY);
-0.0

Если мы рассмотрим тот же случай с положительным числом, мы получим старый добрый 0:

System.out.println(1 / Float.POSITIVE_INFINITY);
0.0

******* Здесь случай, когда использование -0.0 приводит к чему-то другому, чем при использовании 0.0:

System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
Infinity
-Infinity

Это имеет смысл, если мы рассмотрим функцию 1 / x. Поскольку x приближается к 0 из + -side, мы должны получить положительную бесконечность, но по мере приближения от - -side мы должны получить отрицательную бесконечность. График функции должен сделать это ясно:

(источник)

В математическом выражении:

enter image description here

enter image description here

Это иллюстрирует одно существенное различие между 0 и -0 в вычислительном смысле.


Вот некоторые релевантные ресурсы, некоторые из которых уже были подняты. Я включил их для полноты:

Ответ 2

Из Википедии

Подписанный ноль равен нулю со знаком. В обычной арифметике, −0 = +0 = 0. В вычислительной технике существует понятие существования два нуля в некоторых числах, обычно обозначаемых символом −0и '+0', представляющие отрицательный ноль и +0 положительный нуль, (источник).

Это происходит в знаке и значении и дополнении числовые представления для целых чисел, а в большинстве с плавающей запятой числовые представления. Число 0 обычно кодируется как +0, но может может быть представлена ​​либо +0, либо -0.

Согласно IEEE 754 standard отрицательный нуль и положительный нуль должен сравнивать как равный с обычным (численным) сравнением операторов, таких как операторы == из C и Java. (источник).

Когда вы выполняете операцию с плавающей запятой, которая дает результат отрицательный номер с плавающей запятой , близкий к нулю, но это может не быть представлен (при вычислении) он производит "-0,0". Например - 5.0 / Float.POSITIVE_INFINITY -> -0.0.

Это отличает в -0.0 и +0.0, дает вам больше информации, чем просто дает вам окончательный результат 0. Конечно, эта концепция "существует" только в системе конечного представления, подобной той, которая используется в компьютерах. В математике вы можете представить любое число, даже если оно очень близко к нулю.

−0 и +0 являются результатом операций, которые вызывают underflows, аналогичные −00 или +00 являются результатом операций, которые вызывают overflow. Для операций, которые вызывают математически неопределенность, результат ins NaN (например, 0/0).

Какая разница между -0.0 и 0.0?

В действительности оба представляют 0. Кроме того, (-0.0 == 0.0) возвращает true. Тем не менее:

1) 1/-0.0 создает -Infinity, а 1/0.0 создает бесконечность.

2) 3 * (+0)= +0 и +0/-3= -0. Правила знака применяются при выполнении умножений или делении по значению с нулевым значением.

Обязательное чтение " Что должен знать каждый компьютерный ученый о арифметике с плавающей точкой" (предположите в комментариях).

Ответ 3

См. раздел "Подписанный ноль" в Что должен знать каждый компьютерный ученый о арифметике с плавающей точкой

Zeros в Java float и double не просто представляют истинный ноль. Они также используются в качестве результата для любого вычисления, чей точный результат имеет слишком малую величину, которая должна быть представлена. Во многих контекстах существует большая разница между нижним потоком отрицательного числа и нижним потоком положительного числа. Например, если x - очень маленькое положительное число величины, 1/x должно быть положительной бесконечностью, а 1/(-x) должно быть отрицательной бесконечностью. Подписанный нуль сохраняет знак результатов нижнего потока.

Ответ 4

Каноническая ссылка на полезность подписанных нулей в плавающей запятой - это бумага Кахана "" Отсеки ветки для сложных элементарных функций "или" Много шума из ничего "Значок" бит "" (и некоторые из его разговоров по этому вопросу).

Краткая версия заключается в том, что в разумно распространенных инженерных приложениях информация о знаке, которая сохраняется путем подписания нуля, необходима для получения правильных решений из числовых методов. Знак нуля имеет мало значения для большинства реальных операций, но когда рассматриваются комплекснозначные функции или используются конформные отображения, знак нуля может внезапно стать критическим.

Также стоит отметить, что исходный (1985) IEEE-754 комитет рассмотрел и отклонил, поддерживая проективный режим для операций с плавающей запятой, при котором существовала бы только одна беззнаковая бесконечность (+/- 0 была бы семантически идентичны в таком режиме, поэтому, даже если бы были еще два кодирования, был бы только один ноль).