繁体   English   中英

C ++中的SIGFPE方向错误

[英]SIGFPE misdirection in c++

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM