C++ 如何尽早捕获浮点错误(就在发生浮点错误的地方)?

C++ 如何尽早捕获浮点错误(就在发生浮点错误的地方)?,c++,floating-point,C++,Floating Point,在开发浮点重载代码时,启用FPU异常非常有用。当一个操作产生NaN/inf时,我们可以立即捕获它 例如,在Linux上,我可以通过以下方式启用此功能: feenableexcept(FE_DIVBYZERO|FE_INVALID|FE_OVERFLOW); 在苏格兰和南方能源公司之前,这项技术非常有效。然而,今天,对于SSE,这与-ffast math(或其他编译器的其他等效选项)相冲突 原因之一是sqrt,因为sqrt实现为x*rsqrt(x)。当x为零时,会生成一个异常。禁用异常时,这不是

在开发浮点重载代码时,启用FPU异常非常有用。当一个操作产生NaN/inf时,我们可以立即捕获它

例如,在Linux上,我可以通过以下方式启用此功能:

feenableexcept(FE_DIVBYZERO|FE_INVALID|FE_OVERFLOW);
在苏格兰和南方能源公司之前,这项技术非常有效。然而,今天,对于SSE,这与
-ffast math
(或其他编译器的其他等效选项)相冲突

原因之一是sqrt,因为sqrt实现为
x*rsqrt(x)
。当
x
为零时,会生成一个异常。禁用异常时,这不是问题,因为sqrt函数会处理此问题

因此,我不能因此启用异常(可能还有其他原因)


如果启用了
-ffast math
,您有什么建议吗?如何在浮点错误发生的地方尽早捕获它(我不想让NaN传播,我也希望捕获无限大的溢出)?

为什么在开发阶段取消使用
-fast math
不是一个选项?@njuffa:不是真的,因为它会生成不同的代码,所以可能会隐藏问题。在需要最大性能和最大正确性/调试能力之间存在无法解决的冲突。你的问题涉及冲突的一个具体方面。我建议你放弃你更关心的东西,接受由此产生的限制。你可能想改变标题。问题不在于及早捕捉浮点错误;它是为了避免不希望出现的异常。@EOF:显然,clang假设使用的是旧CPU,没有进一步的规范。使用
-march=sandybridge
或更新版本,clang生成
vsqrtss
指令。使用
-march=nehalem
,它通过NR迭代编译为
rsqrt
。请注意,
vsqrtss
在最近的CPU上得到了改进。