Вопрос

#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/%E2%88%920_ (число)

Взгляните на эту статью: http://en.wikipedia.org/wiki/Floating_point.Обратите внимание, что существует знаковый бит, даже если значение равно нулю.

Потому что double действительно может иметь значения -0, + 0, -infinity, +бесконечность и NaN, которые могут быть результатом различных интересных выражений, таких как 0/0.

Посмотри здесь для получения дополнительной информации.

Потому что ваши ожидания неверны.

IEEE требует, чтобы положительный и отрицательный нули были представлены отдельно.

Это то, что вы видите здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top