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

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

我已经尝试了-fsignaling-nans标志,这似乎没有帮助。

几乎任何从非NaN输入产生NaN的浮点运算或数学库函数也应该发出’无效运算’浮点exception的信号; 类似地,从有限输入产生无穷大的计算通常会发出“被零除”或“溢出”浮点exception的信号。 所以你想要一些方法将这些exception变成SIGFPE。

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

 #define _GNU_SOURCE #include  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; } 

需要注意的是:我认为有些设置可能会在(理论上)导致它之后的下一个浮点运算之前实际生成exception,因此有时需要进行无操作浮点运算(例如乘以1.0)以触发exception。

在MinGW 4.8.1(GCC for Win32)上,我看到feenableexcept未定义。 解决方法是使用Win32平台的_controlfp

 #undef __STRICT_ANSI__ // _controlfp is a non-standard function documented in MSDN #include  #include  int main() { _clearfp(); unsigned unused_current_word = 0; // clearing the bits unmasks (throws) the exception _controlfp_s(&unused_current_word, 0, _EM_OVERFLOW | _EM_ZERODIVIDE); // _controlfp_s is the secure version of _controlfp float num = 1.0f, den = 0.0f; float quo = num / den; printf("%.8f\n", quo); // the control should never reach here, due to the exception thrown above }