有没有办法告诉 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/