c++ - 不同编译器上 double 的不同行为

标签 c++ floating-point g++ ieee-754 floating-point-precision

我的代码很简单

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/

相关文章:

c++ - 如何正确检查 istreambuf_iterator 是否已到达流末尾

C++ vector 调整大小元素重新排序?

c++ - nodeMCU 上的持久 https 连接

php - 解析字符串并在货币符号后隔离浮点值

matlab - MATLAB fprintf() 的浮点到文本行为

cmake - 与CMake一起使用时的Log4cxx和完整文件路径

c++ - 使 shared_ptr 不使用删除

Excel将我的数字变成 float

c++ - GCC 6.3.0 中的 ODR 违规,类型定义在两个单独的翻译单元中

c++ - Lambda machine-dependent segmentation-fault(可能是编译器错误?)