【问题标题】:SIGFPE misdirection in c++C ++中的SIGFPE误导
【发布时间】:2014-02-04 17:16:57
【问题描述】:

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

【问题讨论】:

  • 我不确定,但可能是因为在您启用它们时设置了异常标志,但在您执行添加之前不会对其进行测试。

标签: c++ sigfpe


【解决方案1】:

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

【讨论】:

  • 当我使用 10.0 而不是 10 时,我得到了相同的行为
  • @user2535797 请使用新代码编辑您的问题。
  • @user2535797 是否将所有 10 修改为 10.0(其中 3 个)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多