打破NaNs或infs
-
05-07-2019 - |
题
通常很难找到NaN的起源,因为它可能发生在计算的任何步骤并传播自身。 那么当计算返回NaN或inf时,是否可以使C ++程序暂停?我认为最好的是崩溃并发出错误消息:
Foo: NaN encoutered at Foo.c:624
这样的事情可能吗?你有更好的解决方案吗?你如何调试NaN问题?
编辑:精确:我在Linux下与GCC合作。解决方案
您无法以完全可移植的方式执行此操作,但许多平台都提供了允许您访问浮点状态控制寄存器的C API。
具体来说,您希望取消屏蔽溢出和无效的浮点异常,这将导致处理器在程序中的算术产生NaN或无穷大结果时发出异常信号。
在你的linux系统上,这应该可以解决问题:
#include <fenv.h>
...
feenableexcept(FE_INVALID | FE_OVERFLOW);
您可能希望学习编写陷阱处理程序,以便在发出其中一个异常信号时打印诊断消息或继续执行。
其他提示
是的!设置(可能或多或少可移植)符合IEEE 754标准的处理器,以便在遇到NaN或无限时生成中断。
我用Google搜索并找到这些幻灯片,这是一个开始。第5页的幻灯片总结了您需要的所有信息。
我不是C专家,但我希望答案是否定的。
- 这将要求每次浮动计算都要进行此项检查。巨大的性能影响。
- NaN和Inf不是邪恶的。它们可能在您的应用程序使用的某些库中合法使用,并打破它。 醇>
不隶属于 StackOverflow