当运行时计算结果为 NaN 或 inf 时,我可以让 gcc 告诉我吗?

标签 c gcc floating-point

有没有办法告诉 gcc 在运行时抛出 SIGFPE 或类似的东西来响应导致 NaN(-)inf 的计算,就像它一样会被零除吗?

我试过 -fsignaling-nans 标志,但似乎没有帮助。

最佳答案

几乎所有从非 NaN 输入生成 NaN 的浮点运算或数学库函数也应该发出“无效运算”浮点异常信号;类似地,从有限输入产生无穷大的计算通常会发出“被零除”或“溢出”浮点异常的信号。因此,您需要某种方式将这些异常转化为 SIGFPE。

我怀疑答案将高度依赖于系统,因为浮点陷阱和标志的控制很可能由平台 C 库提供,而不是由 gcc 本身提供。但这里有一个在 Linux 上对我有用的例子。它使用 fenv.h 中的 feenableexcept 函数。 _GNU_SOURCE 定义是声明此函数所必需的。

#define _GNU_SOURCE
#include <fenv.h>

int main(void) {
    double x, y, z;
    feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);

    x = 1e300;
    y = 1e300;
    z = x * y; /* should cause an FPE */

    return 0;
}

一个警告:我认为在某些设置中,可能直到(理论上)应该导致异常的浮点运算之后的下一个 才会实际生成异常,因此您有时需要空操作浮点运算(例如乘以 1.0)来触发异常。

关于当运行时计算结果为 NaN 或 inf 时,我可以让 gcc 告诉我吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2941611/

相关文章:

c - 移植到mingw时如何处理 "SIGQUIT"信号?

c - 编译器生成的汇编文件中的 "#APP"是什么意思?

c - C 多线程环境中的浮点损坏

C# 浮点精度

ios - 如何在 swift 中将字节转换为浮点值?

c - 使用自定义 __start 的 GCC/LD 的异常输出

c++ - 在 C++ linux 中使用 glib.h 中的 GMainLoop 而不是 "while(true);"有什么优势?

c - 我如何要求 OpenMP 在每次运行程序时只创建一次线程?

linux - 用于了解可执行文件的文本、BSS 等字段的命令

go - 如何交叉编译solaris 32位