在开发浮点重型代码时,启用FPU异常非常有用。当操作导致NaN / inf时,我们可以立即捕获它。
例如,在Linux上,我可以通过以下方式启用它:
feenableexcept(FE_DIVBYZERO|FE_INVALID|FE_OVERFLOW);
在SSE之前,这项技术就像一种魅力。今天,对于SSE,这与-ffast-math
(或其他编译器的其他等效选项)冲突。
原因之一是sqrt,因为sqrt被实现为x*rsqrt(x)
。当x
为零时,这会产生异常。禁用异常时,这不是问题,因为sqrt函数可以处理此问题。
因此,由于这个原因,我无法启用例外(也许还有其他原因)。
您是否有任何建议,如何在发生错误的地方尽早捕获浮点错误(我不希望NaN传播,我也想捕获溢出到无穷大),如果-ffast-math
已启用?