2014-01-28 43 views
13

我瞭解到,使用==比較一個雙精度不是明智的做法。然而,我想知道如果檢查雙重初始化可能是危險的或不。例如,知道變量doubleVar在初始化後不能爲零,這樣做是否安全?如果您之前將其初始化爲零,那麼將雙精度比較爲零是否正確?

Foo::Foo(){ 
    doubleVar = 0.0; // of type double 
} 

void Foo::Bar(){ 
    if(doubleVar == 0){ // has been initialized? 
     //... 
    }else{ 
     //... 
    } 
} 
+4

是:a)它不是初始化爲0,它的分配0給它,和b)將它與'int' 0進行比較,而不是像它被分配的'double'0.0一樣。 – chris

+0

是的。對於這種情況它是安全的。 – haccks

+0

我很困惑。爲什麼'doubleVar'如果被初始化就不能爲零?你不能將它初始化爲零嗎?誰告訴過你用double比較==不是明智的做法?他們給的原因是什麼? – crush

回答

10

在IEEE-754,長話短說:

double d; 

d = 0.0; 
d == 0.0 // guaranteed to evaluate to true, 0.0 can be represented exactly in double 

double d; 

d = 0.1; 
d == 0.1 // not guaranteed to evaluate to true 
+4

爲什麼後者*不能保證是真的?它是*相同的*值(應按照要求通過相同的促銷活動)。 – user2864740

+1

@ user2864740'0.1'不能完全用'double'(IEEE-754 binary64類型)表示,C表示:*(C99,5.2.4.2.2p8)「除了賦值和強制轉換(這會除去所有額外的範圍和精度) ,浮動操作數和受到通常算術轉換的值的操作值以及浮點常量的值被評估爲格式,其範圍和精度可能大於類型所要求的格式。「* – ouah

+3

@ HAL9000我認爲* doesn' * *因爲在*兩個地方使用相同的值,因此內部具有*相同的*位模式。這與'0.3 + 0.2 == 0.5'類似,涉及數學。 – user2864740