我正在尝试了解以下程序的奇怪行为。显然,在定义全局变量“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
答案 0 :(得分:1)
const double bug = pow(10.0,pow(10.0,10.0));
。因为pow需要(double,double)参数而你传递(int,int)
答案 1 :(得分:0)
一旦我遇到类似的情况,浮点错误就会在陌生的地方出现。据我所知,这是因为FPU状态寄存器不是在每个浮点指令期间同步,因此错误可能看起来是随机的。顺便说一下,我刚编译并启动了你的程序,它完成没有任何问题。 我的解决方案是在计算错误后清除FPU状态寄存器(当然这是黑客,但当时我无法分析该数学库)。