9

为了找到在我的 C++ 程序中将浮点变量设置为 NaN 的原因,我启用了浮点异常,如下所示:

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

我知道它有效,因为当我写的时候:

int val = 0.0/0.0;

在我的程序中,出现了一个浮点异常。但是 NaN 正在通过我的程序的浮点计算“传播”,我不知道哪个变量首先设置为 NaN。

存在什么原因导致变量 beeeing 设置为 NaN,不会导致浮点异常?

4

2 回答 2

6

如果任何输入具有安静的 NaN 值,它将导致几乎所有使用它的浮点运算的结果为 NaN而不会引发无效异常

最可能的解释是某些数据是从错误的地址读取的,而读取的数据(甚至可能不是浮点数据)恰好与安静的 NaN 编码匹配。这很容易发生,因为相对常见的模式0xffff...编码一个安静的 NaN。

于 2012-12-28T16:59:16.540 回答
2

你在做任何平方根运算吗?如果您尝试像 sqrt(-1) 那样计算负数的平方根,那么您将得到一个 Nan。在这种情况下,您应该得到一个“无效操作”异常。您确定您正确捕获了所有异常吗?似乎在您的代码中某处未捕获数字异常。

于 2011-03-25T19:45:48.510 回答