vlambda博客
学习文章列表

一个可能的编译器错误

在尝试寻找计算机中的机器最小值时,意外发现了一个编译器的不寻常现象,如下:

当使用 GNU Fortran, g++ 和 clang 编译器计算一个简单的循环公式 a = a / 1.73 时, 一些令人疑惑不解的情形出现了。
在 gfortran 里,当循环到1385次后, a 的值为 4.9406564584124654E-324 接下来到最终的循环结束,a 的值都一直不变。
这种情形不正常,因为一个非零实数 a 除以一个非零非一的实数(此处为1.73)而得到一个不变的 a 值。在数学上这是不正确的。

这情形类似于物理中的量子系统,系统中的基态(最低)能量被量化了。
同样的情形出现在 GNU g++ 和 clang g++ 编译器中。同样的情形也发生在 a = a / 1.7 和 a = a / 1.77 中。

测试的编译器版本:GNU Fortran (5.4.0 20160609, 8.2.0 2018), GUN g++ (5.4.0 201609), clang g++ (Apple LLVM version 10.0.0, clang-1000.10.44.4)。
测试实在 Linux(Ubuntu,KylinOS)系统和苹果电脑中进行的。
这可能是由于计算机使用的二进制造成的影响。具体原因有待查明。
希望大家提出意见,参与解决。

易天佑

物理学博士后