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