4

通常很难找到 NaN 的起源,因为它可能发生在计算的任何步骤并自行传播。那么当计算返回 NaN 或 inf 时,是否可以让 C++ 程序停止?我认为最好的方法是崩溃并显示一个很好的错误消息:

Foo: NaN encoutered at Foo.c:624

这样的事情可能吗?你有更好的解决方案吗?你如何调试 NaN 问题?

编辑:精度:我在 Linux 下使用 GCC。

4

3 回答 3

7

您无法以完全可移植的方式进行操作,但许多平台提供 C API,允许您访问浮点状态控制寄存器。

具体来说,您希望取消屏蔽溢出和无效浮点异常,这将导致处理器在程序中的算术产生 NaN 或无穷大结果时发出异常信号。

在您的 linux 系统上,这应该可以解决问题:

#include <fenv.h> 
...
feenableexcept(FE_INVALID | FE_OVERFLOW);

您可能想学习编写陷阱处理程序,以便在发出这些异常之一时打印诊断消息或以其他方式继续执行。

于 2009-11-27T15:53:22.303 回答
2

是的!设置(可能或多或少可移植)符合 IEEE 754 的处理器,以在遇到 NaN 或无穷大时生成中断。

我用谷歌搜索并找到了这些幻灯片,这是一个开始。第 5 页的幻灯片总结了您需要的所有信息。

于 2009-11-27T15:50:35.853 回答
0

我不是 C 专家,但我希望答案是否定的。

  1. 这将要求每个浮点计算都进行此检查。巨大的性能影响。
  2. NaN 和 Inf 并不邪恶。它们可能在您的应用程序使用的某些库中合法使用,并破坏它。
于 2009-11-27T15:44:37.473 回答