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

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

74 голоса | спросил Ken Russell 24 62012vEurope/Moscow11bEurope/MoscowSat, 24 Nov 2012 22:42:07 +0400 2012, 22:42:07

4 ответа


0

-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

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

( источник )

В математических терминах:

введите описание изображения здесь

введите описание изображения здесь

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


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

ответил Cowboy Ben Alman 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 28 Sep 2012 07:12:57 +0400 2012, 07:12:57
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 являются результатом из операций, которые вызывают недополнение , похожие −00 или +00 являются результатом операций, которые вызывают переполнение . Для операций, которые вызывают математически неопределенность , результат 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 . Правила знака применяются при выполнении умножения или деления на ноль со знаком.

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

ответил dreamcrash 24 62012vEurope/Moscow11bEurope/MoscowSat, 24 Nov 2012 22:43:35 +0400 2012, 22:43:35
0

См. раздел "Подписанный ноль" в What Every Ученый-компьютерщик должен знать об арифметике с плавающей точкой

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

ответил Patricia Shanahan 24 62012vEurope/Moscow11bEurope/MoscowSat, 24 Nov 2012 22:51:08 +0400 2012, 22:51:08
0

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

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

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

ответил Stephen Canon 25 72012vEurope/Moscow11bEurope/MoscowSun, 25 Nov 2012 23:22:30 +0400 2012, 23:22:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132