c++ == 运算符双

c++ == operator double

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

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

我们是在 "bit representation"(尾数指数)还是小数点上执行条件语句 (b == 50)?我在我的 C++ 书中找不到这些信息。如果是小数,我想我可以去掉条件语句。

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

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

例如,b == 50.0000000000000000000001 的行为可能 完全相同 b == 50.0,因为 50.0000000000000000000001 表示与 50.0.

对于具体的一段代码,使用精确比较是正确的:

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

目的好像是保证除法不会被零除。编写代码可能是为了与被 0 除而不是无穷大导致失败的系统兼容。从任何不完全为 50 的 double 中减去 50 将得到非零结果,因此只需要在完全相等的情况下添加 0.001 软糖因子。