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


почему у двойников есть -0 а также +0? Что такое предыстория и значение?

4 73

4 ответа:

-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 С +-сторона, мы должны получить положительное бесконечность, но как это подходит со стороны --сторона, мы должны получить отрицательный бесконечность. График функции должен сделать это ясно:

(источник)

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

enter image description here

enter image description here

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


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

Из Википедии

подписанный ноль-это ноль со связанным знаком. В обычной арифметике, −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 являются результатом операций, которые вызывают переполнения. Для операций, которые вызывают математически неопределенность результат ins NaN (например, 0/0).

что разница между 0.0 и -0.0?

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

1) 1/-0.0 производит -бесконечность пока 1/0.0 производит бесконечность.

2) 3 * (+0) = +0 и +0/-3= -0. Элемент знак правила применить, при выполнении умножения или деления на нуль.

обязательного чтения "Что Каждый Компьютерный Ученый Должен Знать Об Арифметике С Плавающей Запятой" (предложите в комментариях).

см. раздел "подписанный ноль" в Что Каждый Компьютерный Ученый Должен Знать Об Арифметике С Плавающей Запятой

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

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

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

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