当使用 GNU g++ 和 Fortran 编译器计算一个简单的循环公式 a = a / 1.73 (a 的初始值为 1.0) 时,一些令人不解的情形出现了。 在 g++里,当循环到1304次后, a 的值为 4.94066 e-324 接下来到最终的循环结束,a 的值都一直不变。 这情形不正常,因为一个非零的实数除以一个非零非一的实数这里是 1.73 而得到一个不变的结果。在数学上这是不正确的。 但当设定 a = a / 3.73 当循环到一定次数后,可以得到零。只要是除以一个大于或等于2.0的实数就可以,得到零。 测试的系统包括:Linux(NewStart OS, CentOS, Ubuntu, KylinOS, Mac OS) 测试的编译器:GNU g++, fortran, CLang g++. 这可能是由于计算机使用的二进制造成的影响,具体原因有待查明。 希望大家参与讨论,提出意见和解决方法。 程序如下: #include <iostream> #include <math.h> using namespace std; int main(){ double a; int counter; a = 1.0; counter = 0; while(counter < 1500 && fabs(a) > 0){ counter = counter + 1; a = a / 1.73; cout << "counter = " << counter << ", a = " << a << endl; } } |