c ++ == operator double

时间:2015-01-29 10:44:44

标签: c++ floating-point equality

我知道比较double(相等)是不正确的,最好的是使用如Knuth书(编程艺术)中描述的epsilon因子。尽管如此,我正在研究遗留代码(C ++),其中存在许多偏见:

// b,c double from previous computation
if( b == 50.0) 
    b += 0.001;
double a = c/(b - 50.0);

我们是否对“位表示”(尾数 - 指数)或十进制表达式执行条件语句(b == 50)?我在C ++书上找不到这些信息。如果它是小数,我想我可以通过条件语句。

2 个答案:

答案 0 :(得分:3)

==运算符应用于浮点值的运行时表示,理想情况下恰好具有该类型隐含的指数和有效位数,但不幸的是,有时以更宽的格式表示,标准允许。

b == 50.0中,十进制表示50.0在编译时一劳永逸地转换为这样的浮点表示。每次涉及此表达式50.0时,将使用该值(或程序的行为就像使用它一样)。在50.0的情况下,它没有什么区别,因为数字50可以完全表示为二进制浮点值。

例如,b == 50.0000000000000000000001可能表现为完全b == 50.0,因为50.0000000000000000000001表示与50.0相同的浮点值。

答案 1 :(得分:3)

对于特定的代码段,使用精确比较是正确的:

// b,c double from previous computation
if( b == 50.0) 
    b += 0.001;
double a = c/(b - 50.0);

目的似乎是确保分裂不会被零除。代码可能已被编写为与系统兼容,其中除以0导致失败,而不是无穷大。从任何不完全为50的双精度中减去50将得到非零结果,因此只有在完全相等的情况下才需要添加0.001软糖因子。