使用Infinity和NaN禁用异常

时间:2018-11-09 12:12:24

标签: c nan infinity math.h

我有一个庞大的项目(不是我自己构建的),该项目具有InfinityNaN值。尽管允许,但这不是可取的。我read认为,这些值是通过以下类型的操作生成的:

1/0 = ∞
log (0) = -∞
sqrt (-1) = NaN

,此外,到达它们时,应该抛出FP Exception

如果我的项目允许对NaNInfinity进行操作,我认为SIGFPE可以在某个地方处理,但我在整个项目中进行了搜索,找不到它。

还有另一种禁用此异常的方法吗?我的目标是能够检测到此类值的首次出现。

编辑: 我正在使用Windows,并且打算启用该信号,但是在启用该信号之前,我想了解是否已禁用该信号。

1 个答案:

答案 0 :(得分:3)

我认为您不会遇到正在谈论的问题。默认情况下,不引发FP异常。从Windows documentation

  

默认情况下,系统关闭所有FP异常。因此,   计算结果为NAN或INFINITY,而不是异常。   在使用结构化陷阱捕获浮点(FP)异常之前   异常处理,您必须调用_controlfp_s C运行时库   函数打开所有可能的FP异常。仅陷阱   特定的例外情况,请仅使用与   被困的异常。请注意,任何针对FP错误的处理程序都应   调用_clearfp作为其第一条FP指令。该功能清除   浮点异常。

GCC也是如此,documentation表示:

  

发生异常时(引发异常时,用   标准),则可能会发生以下两种情况之一。默认情况下例外   只需在浮点状态字中注明,程序   继续,好像什么都没发生。该操作产生一个默认值   值,取决于异常[...]。您的程序可以检查   状态字以找出发生了哪些异常。

要在Windows环境中启用异常(将停止程序执行),您可以尝试类似的操作

#include <float.h>

int main() {
    _clearfp();
    unsigned int current_word = 0;
    _controlfp_s(&current_word, ~_EM_ZERODIVIDE, _MCW_EM);
    double div = 0.;
    double f = 1. / div;
}

对于非阻塞解决方案,请尝试按here在cppreference.com上使用fenv.h