除零不会抛出SIGFPE

Division by zero does not throw SIGFPE

本文关键字:SIGFPE      更新时间:2023-10-16

我有一个执行浮点除零的小程序,所以我期望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 FPEn";
    }
}
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 version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

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

谢谢

只有在整数除零时才会得到信号。对于浮点数,除零的定义很好。

这在维基百科的文章中有很好的解释。

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

您没有得到信号,因为大多数机器上的默认行为是用nan(非数字)和无穷大污染您的数据。您必须启用浮点异常,而如何做到这一点取决于机器。看看系统标头fenv.h,如果你有的话。函数fesettrapenable可以在许多机器上捕获浮点异常。

遗憾的是,没有标准函数来开启浮点异常处理。