2014-01-28 21 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