Почему числа с плавающей запятой имеют подписанные нули?
почему у двойников есть -0
а также +0
? Что такое предыстория и значение?
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
С+
-сторона, мы должны получить положительное бесконечность, но как это подходит со стороны-
-сторона, мы должны получить отрицательный бесконечность. График функции должен сделать это ясно:(источник)
в математические термины:
это иллюстрирует одно существенное различие между
0
и-0
в вычислительном смысле.
вот некоторые соответствующие ресурсы, некоторые из которых уже были подняты. Я включил их для полноты картины:
- статья Википедии о подписанном нуле
- "Что Каждый Компьютерный Ученый Должен Знать Об Арифметике С Плавающей Запятой" (см. подписанный нулевой раздел)
- (PDF) "много шума из ничего знак бит" - интересная статья В. Кахана.
Из Википедии
подписанный ноль-это ноль со связанным знаком. В обычной арифметике,
−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 была бы семантически идентична в таком режиме, поэтому даже если бы были еще две кодировки, там будет только один ноль, а также).