通常很难找到 NaN 的起源,因为它可能发生在计算的任何步骤并自行传播。那么当计算返回 NaN 或 inf 时,是否可以让 C++ 程序停止?我认为最好的方法是崩溃并显示一个很好的错误消息:
Foo: NaN encoutered at Foo.c:624
这样的事情可能吗?你有更好的解决方案吗?你如何调试 NaN 问题?
编辑:精度:我在 Linux 下使用 GCC。
通常很难找到 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 或无穷大时生成中断。
我用谷歌搜索并找到了这些幻灯片,这是一个开始。第 5 页的幻灯片总结了您需要的所有信息。
我不是 C 专家,但我希望答案是否定的。