Используется для отрицательного значения с плавающей точкой?
Рассмотрим следующий код С++:
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 для ног, поэтому мы знаем, что это отрицательно.