#include <iostream>
using namespace std;
int main()
{
double u = 0;
double w = -u;
cout << w << endl;
return 0;
}
Почему этот замечательный фрагмент кода выводит -0, а не 0, как можно было бы ожидать?
Отличный код C++ не может иметь using namespace std;.





Стандарт IEEE 754 для чисел с плавающей запятой имеет бит знака, отдельный от мантиссы, что позволяет нулю быть отрицательным. Википедия должен помочь объяснить это.
Потому что «отрицательный ноль» - допустимое число!
Взгляните на эту статью: http://en.wikipedia.org/wiki/Floating_point. Обратите внимание, что есть бит знака, даже если значение равно нулю.
В IEEE с плавающей запятой 0 и -0 являются разными значениями, начиная с здесь в разделе «Специальные значения»:
Note that -0 and +0 are distinct values, though they both compare as equal.
Стандарт IEEE 754 для арифметики с плавающей запятой делает различие между +0 и -0, это может использоваться при работе с очень маленькими числами, округленными до нуля, где знак все еще имеет значение.
Потому что double действительно может иметь значения -0, +0, -infinity, + infinity и NaN, что может быть результатом различных интересных выражений, например 0/0.
Посмотрите здесь для получения дополнительной информации.
Потому что ваши ожидания ошибочны.
IEEE требует, чтобы положительный и отрицательный ноль были представлены отдельно.
Вот что вы здесь видите.
было бы полезно немного больше контекста (например, компилятор, используемый для начала)