2013-04-17 7 views
23
double a = 0; 
double b = -42; 
double result = a * b; 
cout << result; 

Результат a * b is -0, но я ожидал 0. Где я неправ?Почему это двойное значение напечатано как «-0»?

+16

Я считаю 0 == -0, поэтому проблем нет. -0 - проблема с плавающей запятой. – 2013-04-17 18:47:59

+6

[Статья в Википедии о подписанном ноль] (http://en.wikipedia.org/wiki/Negative_zero) стоит прочитать. – halex

+2

Я редактировал заголовок, чтобы сделать его более конкретным. –

ответ

31

Бит представление из -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 ,

Надеюсь, что это поможет.

+1

http://en.wikipedia.org/wiki/IEEE_754#Formats «Нулевые значения - это конечные значения с значащим значением 0. Это знаковые знаки, знаковый бит указывает, что ноль равен +0 (положительный ноль) или -0 (отрицательный ноль). " – TNW

+0

Tnx, ты мне помог. – hofmn

+1

Сравнение с плавающей запятой '==' и '! =' Небезопасно. Никогда этого не делай. – Walter

Смежные вопросы