如何及早发现浮点错误(就在它们发生的地方)?

How to catch floating point errors early (right at where they occur)?

提问人:geza 提问时间:12/18/2018 最后编辑:geza 更新时间:12/18/2018 访问量:222

问:

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

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

feenableexcept(FE_DIVBYZERO|FE_INVALID|FE_OVERFLOW);

在上交所之前,这种技术就像一个魅力。然而,今天,对于 SSE,这与(或其他编译器的其他等效选项)相冲突。-ffast-math

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

因此,我无法因此启用异常(也许还有其他原因)。

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

C++ 浮点

评论

3赞 njuffa 12/18/2018
为什么在开发阶段取消使用不是一种选择?-fast-math
0赞 geza 12/18/2018
@njuffa:不是真的,因为它会生成不同的代码,所以它可以隐藏问题。
2赞 njuffa 12/18/2018
在想要最大的性能和最大的正确性/调试能力之间存在着无法解决的冲突。你的问题涉及该冲突的一个具体方面。我建议默认你更关心的东西,并忍受由此产生的限制。
1赞 Eric Postpischil 12/18/2018
您可能需要更改标题。问题不在于及早发现浮点错误;这是关于避免不需要的异常。
1赞 wim 12/19/2018
@EOF : 显然 clang 假设使用旧的 CPU,没有进一步的规范。使用 ,或更新时,clang 会生成一条指令。有了它,编译成一个带有 NR 迭代的。请注意,在最近的 CPU 上已得到改进。-march=sandybridgevsqrtss-march=nehalemrsqrtvsqrtss

答: 暂无答案