SIGFPE在c ++中误导

时间:2014-02-04 07:31:48

标签: c++ sigfpe

我正在尝试了解以下程序的奇怪行为。显然,在定义全局变量“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

2 个答案:

答案 0 :(得分:1)

应该使用

const double bug = pow(10.0,pow(10.0,10.0));。因为pow需要(double,double)参数而你传递(int,int)

答案 1 :(得分:0)

一旦我遇到类似的情况,浮点错误就会在陌生的地方出现。据我所知,这是因为FPU状态寄存器不是在每个浮点指令期间同步,因此错误可能看起来是随机的。顺便说一下,我刚编译并启动了你的程序,它完成没有任何问题。 我的解决方案是在计算错误后清除FPU状态寄存器(当然这是黑客,但当时我无法分析该数学库)。