C浮点数零比较

4
以下代码中,两行之间没有任何内容,对于布尔值变量b,是否总是会生成true的值?
double d = 0.0;
bool b = (d == 0.0);

我正在使用g++ 4.8.1版本。

7
我不理解这个回答为什么会被踩。如果你经常浏览这个网站,对于浮点数比较有点过于谨慎也是可以接受的。 - Mysticial
4
在浮点数运算中,与运算符==不同的是,加法和乘法在某些情况下可能会产生不准确的结果,但是==操作符始终可以根据其输入产生完全正确的结果。 - Eric Postpischil
4
@AndonM.Coleman:打赌一个计算精确数值结果为零的算式,在计算机上得到的结果也是零,并不是唯一的赌注。你说任何赌注都无效,我的观点是这并非事实。下注计算机计算出的值是符合 IEEE 754 标准指定值的赌注是有效的,可以使用 IEEE 754 的规则推导关于计算值的正式陈述,并可以使用这些规则设计软件以产生所需的结果。 - Eric Postpischil
4
@Michael:对于 ==,正确的定义是如果两个输入值相等,则结果为真。你提出的 .3 + .2 == .5 并不是一个反例,因为这种情况下的误差出现在加法运算中而不是等于操作,正如我之前所说的那样。 - Eric Postpischil
5
正如我所说,对IEEE 754的绑定是宽松的。然而,并非每个人都编写可移植性程序; 有一些非常重要的应用是不可移植的。应该提倡编写良好浮点数的知识,因为这是有用的。此外,我们应该主张编译器遵守IEEE 754(至少在通过选项请求时),以便我们获得IEEE 754的好处。 - Eric Postpischil
显示剩余12条评论
1个回答

8
假设采用IEEE-754标准(大多数浮点数表示法都是如此),这是正确的,因为所有IEEE-754格式都可以准确地表示0.0。
现在,如果我们采用另一个在IEEE-754二进制格式中无法准确表示的字面值,比如0.1:
double d = 0.1;
bool b = (d == 0.1);

这可能导致b对象的值为false

实现有权例如对d使用双精度以及对字面量进行比较时使用更高的精度。

(C99,5.2.4.2.2p8) "除赋值和强制转换(它们移除所有额外的范围和精度)之外,具有浮点运算数和值以及应用通常算术转换的值以及浮点常量的操作的值被计算到一个格式中,其范围和精度可能大于类型所需的。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接