通常很难找到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专家,但我希望答案是否定的。

  1. 这将要求每次浮动计算都要进行此项检查。巨大的性能影响。
  2. NaN和Inf不是邪恶的。它们可能在您的应用程序使用的某些库中合法使用,并打破它。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top