Использует для отрицательного нулевого значения с плавающей точкой? - PullRequest
21 голосов
/ 30 октября 2011

Рассмотрим следующий код C ++:

double someZero = 0;
std::cout << 0 - someZero << '\n';   // prints 0
std::cout << -someZero << std::endl; // prints -0

Возникает вопрос: для чего нужен отрицательный ноль, и следует ли его избегать в обороне (т.е. использовать вычитание вместо удара минусом по переменной)?

Ответы [ 5 ]

21 голосов
/ 30 октября 2011

Из Википедии:

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

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

Один пример из этой статьи - 1/(+0) против 1/(-0). Здесь знак нуля имеет огромное значение, поскольку первое выражение равно +inf, а второе - -inf.

2 голосов
/ 30 октября 2011

Кроме того, подписанный ноль подходит для:

Нули можно рассматривать как вариант расширенной строки действительных чисел, такой что 1 / −0 = −∞ и 1 / + 0 = + ∞, деление наноль не определен только для ± 0 / ± 0.

Отрицательный знак ноль повторяет концепцию математического анализа приближения к 0 снизу как односторонний предел, который можно обозначить через x → 0−, x → 0- или x → ↑ 0.Обозначение «-0» может использоваться неофициально для обозначения небольшого отрицательного числа, которое было округлено до нуля.Концепция отрицательного нуля также имеет некоторые теоретические применения в статистической механике и других дисциплинах

0 голосов
/ 19 октября 2017

Я создаю измерительное приложение, и -0 очень полезен для смешанных чисел (например, деление на футы и дюймы).

Представьте, что у нас есть переменная «длина», которую мыпытаясь разделить на "футы" и "дюймы".

(Это код Java, но та же идея верна для C ++).

feet = Math.signum(length) * Math.floor(Math.abs(length / 12));
// could also do feet = length>0 ? Math.floor(length / 12) : Math.ceil(length / 12)
inches = Math.abs(length) % 12;

Если длина между -1футов и 0 футов, мы бы хотели, чтобы это было -0 для ног, чтобы мы знали, что это отрицательно.

0 голосов
/ 30 октября 2011

Есть только два реальных варианта использования, которые я вижу:

  1. Вы хотите показать, что значение отрицательное, но очень очень маленькое (возможно, бесконечно малое), т.е. слишком маленькое, чтобы представлять его какfloat или double.
  2. Вы работаете с математикой, которая допускает только негативы, но все еще хочет отображать ноль.В физике, комплексных числах и теории чисел есть несколько случаев, когда это может быть полезно.

В большинстве случаев это бесполезно и его следует избегать.

Вы также можетечтобы взглянуть на этот вопрос: Есть ли отрицательный ноль? и IEEE 754 spec для плавающей запятой.

0 голосов
/ 30 октября 2011

Отрицательный ноль может, например, использоваться при обработке комплексных чисел ...

При повседневном использовании следует избегать отрицательного нуля.

Некоторые ссылки с информацией относительно фона / использования / ловушек "отрицательного нуля":

...