cout выводит “-0” вместо “0”
-
09-06-2019 - |
Вопрос
#include <iostream>
using namespace std;
int main()
{
double u = 0;
double w = -u;
cout << w << endl;
return 0;
}
Почему этот замечательный фрагмент кода выводится -0
и не 0
, как и следовало ожидать?
Решение
Стандарт IEEE 754 для чисел с плавающей запятой имеет знаковый бит, отдельный от мантиссы, что позволяет нулю быть отрицательным. Википедия должен быть в состоянии помочь объяснить это.
Другие советы
В IEEE с плавающей запятой 0
и -0
являются обоими различными значениями, начиная с здесь в разделе "Особые значения":
Обратите внимание, что -0 и +0 являются различными значениями, хотя они оба сравниваются как равные.
Стандарт IEEE 754 для арифметики с плавающей запятой проводит различие между +0
и -0
, это может быть использовано при работе с очень маленькими числами, округленными до нуля, где знак все еще имеет значение.
Потому что "отрицательный ноль" - это допустимое число!
Взгляните на эту статью: http://en.wikipedia.org/wiki/Floating_point.Обратите внимание, что существует знаковый бит, даже если значение равно нулю.
Потому что double действительно может иметь значения -0, + 0, -infinity, +бесконечность и NaN, которые могут быть результатом различных интересных выражений, таких как 0/0.
Посмотри здесь для получения дополнительной информации.
Потому что ваши ожидания неверны.
IEEE требует, чтобы положительный и отрицательный нули были представлены отдельно.
Это то, что вы видите здесь.