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

a * b的結果是-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.00.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