17

我有一个小程序执行浮点除以零,所以我期待 SIGFPE。

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

void signal_handler (int signo) {
    if(signo == SIGFPE) {
      std::cout << "Caught FPE\n";
    }
}

int main (void) {
  signal(SIGFPE,(*signal_handler));

  double b = 1.0;
  double c = 0.0;
  double d = b/c;
  std::cout << "d = "<< d << std::endl;
  return 0;
}

实际上,我得到了以下输出:

d = inf

gcc 版本 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

在这种情况下我应该怎么做才能抛出 SIGFPE?FP 操作行为取决于哪些因素(编译器标志/CPU 类型等)?

谢谢

4

3 回答 3

11

如果您执行整数除以零,您只会得到一个信号。对于浮点数,除以零是明确定义的。

这实际上在Wikipedia 文章中得到了很好的解释。

于 2011-09-01T08:49:43.060 回答
6

对于浮点数,您可以通过设置 FPU 控制字来更改此行为。看看这里

于 2011-09-01T08:58:37.393 回答
6

您没有收到信号,因为大多数机器上的默认行为是使用 NaN(非数字)和无穷大来污染您的数据。您必须启用浮点异常,以及如何做到这一点是特定于机器的。查看系统标题fenv.h,如果有的话。该函数fesettrapenable可以在许多机器上捕获浮点异常。

不幸的是,没有标准函数可以打开浮点异常处理。

于 2011-09-01T09:15:33.560 回答