В чем разница между -0 и 0? - PullRequest
       2

В чем разница между -0 и 0?

7 голосов
/ 14 сентября 2010

В C ++, например, fmod(-2,2) возвращает -0.Выражение -0 == 0 верно, но биты разные.Какова цель иметь что-то вроде -0, которое должно быть 0, но представлено по-другому?-0 используется точно так же, как 0 в любых вычислениях?

Ответы [ 4 ]

13 голосов
/ 14 сентября 2010

Нет, +0 и -0 не используются одинаково в каждом вычислении.Например:

3·(+0) = +0
+0/-3 = -0

Я предлагаю вам прочитать Что должен знать каждый учёный-компьютерщик об арифметике с плавающей точкой Дэвида Голдберга, которая проливает свет на то, почему +0 и -0необходим в арифметике с плавающей запятой и в чем они отличаются.

Примеры того, как +0 ad -0 различаются (и почему это может быть полезно при работе со сложными значениями), можно найти в Kahan, W.1987. Отрезки веток для сложных элементарных функций в «Современном состоянии в численном анализе» (я не смог найти pdf этой статьи, вы можете найти его в местной университетской библиотеке).

10 голосов
/ 14 сентября 2010

Страница Подписанный ноль Википедии ответит на большинство из этих вопросов:

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

Стандарт IEEE 754 для арифметики с плавающей точкой (в настоящее время используется большинством компьютеров и языков программирования, поддерживающих плавающую точкучисла) требует как +0, так и -0.Нули можно рассматривать как вариант расширенной строки действительных чисел, такой что 1 / −0 = −∞ и 1 / + 0 = + ∞, деление на ноль не определено только для ± 0 / ± 0.

(...)

Утверждается, что включение нуля со знаком в IEEE 754 значительно упрощает достижение численной точности в некоторых критических задачах, в частности, при вычислениях со сложными элементарными функциями.

3 голосов
/ 14 сентября 2010

Стандарт IEEE 754 допускает как +0, так и -0. Та же мантисса, другой знак. Они должны быть одинаковыми в вычислениях.

0 голосов
/ 14 сентября 2010

Я полагаю, что отрицательный знак вызван реализацией fmod (mis?), Где бит знака обрабатывается явно и возвращается к результату в конце обработки.

...