Используется для отрицательного значения с плавающей точкой?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Кроме того Подпись Нуль Хорошо для:

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Для большей части это не полезно и его следует избегать.

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

Ответ 5

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

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

(Это java-код, но та же идея верна для С++).

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 для ног, поэтому мы знаем, что это отрицательно.