我的代码很简单
double d = 405, g = 9.8, v = 63;
double r = d * g / (v * v);
printf("%s\n",(r>1.0)?"GT":"LE");
这是我的结果
- g++-mingw32-v4.8.1: LE(结果确实是EQ)
- ubuntu 上的 g++:GT(这个结果来 self 的 friend ,只是手头没有 linux)
- VC++ 11:GT
- C#(.Net 4.5):GT
- Python v2.7.3 :GT(这也是我 friend 的)
- Haskell(GHCi v7.6.3):GT
g++-mingw、vc++、c#、haskell 都在我的 i7-2630QM 机器上运行
Python-win32 版本来 self 的 friend ,他还从他的 g++-mingw-3.4.2 中获得了 LE。
而ubuntu版本来自另一个 friend ...
只有g++给我LE,其他都是GT。
我只想知道哪个是错误的,g++ 还是其他。
或者在 IEEE 754 中它应该是什么,GT 还是 LE?
最佳答案
IEEE 754 64 位二进制结果是 GT。
9.8 的两个完全可表示的值是:
9.7999999999999989341858963598497211933135986328125
9.800000000000000710542735760100185871124267578125
第二个更接近9.8,所以应该选择正常的四舍五入模式。它略大于 9.8,导致乘积略大于实数算术所产生的乘积 3969.00000000000045474735088646411895751953125。 v
到 double 的转换是精确的,v*v
乘法也是如此。结果是一个比 3969 稍大的数除以 3969。四舍五入后的结果是 1.0000000000000002220446049250313080847263336181640625
关于c++ - 不同编译器上 double 的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18840730/