【发布时间】:2012-05-09 15:39:26
【问题描述】:
我发现了一个有趣的案例,相同的 C++ 代码在不同的系统上产生不同的结果。
#include <cstdio>
int main()
{
int a=20, b=14;
if(a*1.0/b*(a+1)/(b+1)==2) printf("YES!");
else printf("NO!");
}
使用 GCC 4.6.3 在 Ubuntu Linux 12.04 上编译,它输出 YES!
在 Windows 7 上使用 GCC 4.6.2 编译,输出 NO!
但是,使用:
double c = a*1.0/b*(a+1)/(b+1);
if (c==2) printf("YES!");
...
将在两台机器上返回 YES!。
任何想法为什么会出现这种差异?这是由编译器版本不匹配引起的(路径级别版本号应该不那么重要)?以及为什么它在Windows机器上实际输出NO!,而这种情况显然是正确的?
【问题讨论】:
-
浮点数!!!
-
浮点运算大家应该知道的:docs.sun.com/source/806-3568/ncg_goldberg.html
-
与浮点数精确比较是个坏主意
-
从 if 中删除“.0”,两者都是一样的。
标签: c++ gcc mingw multiplatform