В C ++, например, fmod(-2,2) возвращает -0.Выражение -0 == 0 верно, но биты разные.Какова цель иметь что-то вроде -0, которое должно быть 0, но представлено по-другому?-0 используется точно так же, как 0 в любых вычислениях?
fmod(-2,2)
-0
-0 == 0
0
Нет, +0 и -0 не используются одинаково в каждом вычислении.Например:
+0
3·(+0) = +0 +0/-3 = -0
Я предлагаю вам прочитать Что должен знать каждый учёный-компьютерщик об арифметике с плавающей точкой Дэвида Голдберга, которая проливает свет на то, почему +0 и -0необходим в арифметике с плавающей запятой и в чем они отличаются.
Примеры того, как +0 ad -0 различаются (и почему это может быть полезно при работе со сложными значениями), можно найти в Kahan, W.1987. Отрезки веток для сложных элементарных функций в «Современном состоянии в численном анализе» (я не смог найти pdf этой статьи, вы можете найти его в местной университетской библиотеке).
Страница Подписанный ноль Википедии ответит на большинство из этих вопросов:
Подписанный ноль - это ноль со связанным знаком.В обычной арифметике -0 = 0. Однако в вычислениях некоторые числовые представления допускают существование двух нулей, часто обозначаемых как -0 (отрицательный ноль) и +0 (положительный ноль).Это происходит в некоторых представлениях чисел со знаком для целых чисел и в большинстве представлений чисел с плавающей точкой.Число 0 обычно кодируется как +0, однако оно может быть представлено либо +0, либо -0. Стандарт IEEE 754 для арифметики с плавающей точкой (в настоящее время используется большинством компьютеров и языков программирования, поддерживающих плавающую точкучисла) требует как +0, так и -0.Нули можно рассматривать как вариант расширенной строки действительных чисел, такой что 1 / −0 = −∞ и 1 / + 0 = + ∞, деление на ноль не определено только для ± 0 / ± 0. (...) Утверждается, что включение нуля со знаком в IEEE 754 значительно упрощает достижение численной точности в некоторых критических задачах, в частности, при вычислениях со сложными элементарными функциями.
Подписанный ноль - это ноль со связанным знаком.В обычной арифметике -0 = 0. Однако в вычислениях некоторые числовые представления допускают существование двух нулей, часто обозначаемых как -0 (отрицательный ноль) и +0 (положительный ноль).Это происходит в некоторых представлениях чисел со знаком для целых чисел и в большинстве представлений чисел с плавающей точкой.Число 0 обычно кодируется как +0, однако оно может быть представлено либо +0, либо -0.
Стандарт IEEE 754 для арифметики с плавающей точкой (в настоящее время используется большинством компьютеров и языков программирования, поддерживающих плавающую точкучисла) требует как +0, так и -0.Нули можно рассматривать как вариант расширенной строки действительных чисел, такой что 1 / −0 = −∞ и 1 / + 0 = + ∞, деление на ноль не определено только для ± 0 / ± 0.
(...)
Утверждается, что включение нуля со знаком в IEEE 754 значительно упрощает достижение численной точности в некоторых критических задачах, в частности, при вычислениях со сложными элементарными функциями.
Стандарт IEEE 754 допускает как +0, так и -0. Та же мантисса, другой знак. Они должны быть одинаковыми в вычислениях.
Я полагаю, что отрицательный знак вызван реализацией fmod (mis?), Где бит знака обрабатывается явно и возвращается к результату в конце обработки.