除以零不会抛出 SIGFPE

发布于 2024-12-02 07:57:16 字数 674 浏览 3 评论 0原文

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

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

谢谢

I have a small program performing floating-point division by zero, so I expect 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;
}

Actually, I got the following output:

d = inf

gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

What should I do to throw SIGFPE in this case? Which factors FP operation behaviour depend on (compiler flags/CPU type and so on)?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

迟月 2024-12-09 07:57:17

仅当执行整数除以零时,才会收到信号。对于浮点数,除以零是明确定义的。

这实际上在维基百科文章中得到了很好的解释。

You only get a signal if you perform an integer division by zero. For floating point numbers, division by zero is well defined.

This is actually explained rather well in the Wikipedia article.

强者自强 2024-12-09 07:57:17

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

For floating point numbers you can change this behavior by setting up FPU control word. Take a look here

思念绕指尖 2024-12-09 07:57:17

您不会收到信号,因为大多数机器上的默认行为是用 NaN(非数字)和无穷大来污染您的数据。您必须启用浮点异常,具体操作方式取决于机器。查看系统标头 fenv.h(如果有的话)。函数 fesettrapenable 可以在许多机器上捕获浮点异常。

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

You don't get a signal because the default behavior on most machines is to pollute your data with NaNs (not-a-number) and infinities. You have to enable floating point exceptions, and how you do that is machine specific. Look at the system header fenv.h, if you have one. The function fesettrapenable enables catching floating point exceptions on many machines.

Unfortunately, there is no standard function to turn floating point exceptions handling on.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文