double a = 0;
double b = -42;
double result = a * b;
cout << result;
Результат a * b
is -0
, но я ожидал 0
. Где я неправ?Почему это двойное значение напечатано как «-0»?
double a = 0;
double b = -42;
double result = a * b;
cout << result;
Результат a * b
is -0
, но я ожидал 0
. Где я неправ?Почему это двойное значение напечатано как «-0»?
Бит представление из -0.0
и 0.0
являются разные, но они же значение, так -0.0==0.0
вернется true
. В вашем случае result
- -0.0
, потому что один из операндов отрицательный.
Смотрите эту демку:
#include <iostream>
#include <iomanip>
void print_bytes(char const *name, double d)
{
unsigned char *pd = reinterpret_cast<unsigned char*>(&d);
std::cout << name << " = " << std::setw(2) << d << " => ";
for(int i = 0 ; i < sizeof(d) ; ++i)
std::cout << std::setw(-3) << (unsigned)pd[i] << " ";
std::cout << std::endl;
}
#define print_bytes_of(a) print_bytes(#a, a)
int main()
{
double a = 0.0;
double b = -0.0;
std::cout << "Value comparison" << std::endl;
std::cout << "(a==b) => " << (a==b) <<std::endl;
std::cout << "(a!=b) => " << (a!=b) <<std::endl;
std::cout << "\nValue representation" << std::endl;
print_bytes_of(a);
print_bytes_of(b);
}
Выход ([email protected]):
Value comparison
(a==b) => 1
(a!=b) => 0
Value representation
a = 0 => 0 0 0 0 0 0 0 0
b = -0 => 0 0 0 0 0 0 0 128
Как вы можете видеть себя, то последних байт -0.0
отличаются от последнего байт 0.0
,
Надеюсь, что это поможет.
http://en.wikipedia.org/wiki/IEEE_754#Formats «Нулевые значения - это конечные значения с значащим значением 0. Это знаковые знаки, знаковый бит указывает, что ноль равен +0 (положительный ноль) или -0 (отрицательный ноль). " – TNW
Tnx, ты мне помог. – hofmn
Сравнение с плавающей запятой '==' и '! =' Небезопасно. Никогда этого не делай. – Walter
Я считаю 0 == -0, поэтому проблем нет. -0 - проблема с плавающей запятой. – 2013-04-17 18:47:59
[Статья в Википедии о подписанном ноль] (http://en.wikipedia.org/wiki/Negative_zero) стоит прочитать. – halex
Я редактировал заголовок, чтобы сделать его более конкретным. –