新支点操作系统社区 版块 桌面操作系统 开发者专区 一个潜在的编译器错误 potential compiler bugs ...
当使用 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;
}
}


收藏

用户回复

跳转到指定楼层
想不到好名字 学前班2020-7-10 10:50:18
不懂,帮顶下吧。
高级模式
B Color Image Link Quote Code Smilies
您需要登录后才可以发帖 登录 | 立即注册

Copyright © 2004-2020 广东中兴新支点技术有限公司 All Rights Reserved 粤ICP备15061780号-2  QQ客服
Powered by Discuz! © 2001-2020 Comsenz Inc.
返回顶部