我有一个庞大的项目(不是我自己构建的),该项目具有Infinity
和NaN
值。尽管允许,但这不是可取的。我read认为,这些值是通过以下类型的操作生成的:
1/0 = ∞
log (0) = -∞
sqrt (-1) = NaN
,此外,到达它们时,应该抛出FP Exception
。
如果我的项目允许对NaN
和Infinity
进行操作,我认为SIGFPE
可以在某个地方处理,但我在整个项目中进行了搜索,找不到它。
还有另一种禁用此异常的方法吗?我的目标是能够检测到此类值的首次出现。
编辑: 我正在使用Windows,并且打算启用该信号,但是在启用该信号之前,我想了解是否已禁用该信号。
答案 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(¤t_word, ~_EM_ZERODIVIDE, _MCW_EM);
double div = 0.;
double f = 1. / div;
}
对于非阻塞解决方案,请尝试按here在cppreference.com上使用fenv.h
。