我正在尝试理解下面这个程序的奇怪行为。显然,在定义全局变量"bug“的过程中发生了溢出,但程序在无害的计算1.0+2.0期间抛出了一个浮点异常。
#include <iostream>
#include <cmath>
#include <fenv.h>
using namespace std;
const double bug = pow(10.0,pow(10.0,10.0));
int main(void)
{
feenableexcept(-1);
cout << "before" << endl;
cout << 1.0 + 2.0 << endl;
cout << "after" << endl;
return 0;
}我尝试用g++和clang++编译它,但都得到了相同的输出
before
Floating point exception发布于 2014-02-04 15:33:20
应该使用const double bug = pow(10.0,pow(10.0,10.0));。因为pow需要(double,double)参数而你正在传递(int,int)
发布于 2014-02-04 17:16:58
有一次我遇到类似的情况,浮点错误出现在奇怪的地方。据我所知,这是因为FPU状态寄存器是同步的,而不是在每个浮点指令期间,所以错误可能看起来是随机的。顺便说一下,我刚刚编译并启动了你的程序,它完成了,没有任何问题。我的解决方案是在错误计算后清除FPU状态寄存器(当然这是hack,但当时我无法分析那个数学库)。
https://stackoverflow.com/questions/21546484
复制相似问题