0

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

2 回答 2

1

const double bug = pow(10.0,pow(10.0,10.0));应该使用。因为 pow 需要(double,double)参数并且您正在传递(int,int)

于 2014-02-04T07:33:19.903 回答
0

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

于 2014-02-04T09:16:57.960 回答