C++应用程序中NaN的原因没有引发浮点异常

Nat*_*han 8 c++ nan floating-point-exceptions

为了找到在我的C++程序中设置为NaN的浮点变量的原因,我启用了这样的浮点异常:

#include <fenv.h>
feenableexcept(FE_INVALID | FE_OVERFLOW);
Run Code Online (Sandbox Code Playgroud)

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

int val = 0.0/0.0;
Run Code Online (Sandbox Code Playgroud)

在我的程序中,浮点异常上升.但NaNs正在通过我的程序的浮点计算"传播",我不知道哪个变量首先设置为NaN.

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

Ste*_*non 6

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

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


reg*_*ter 2

你在做平方根运算吗?如果您尝试计算负数的平方根(如 sqrt(-1) 所示),那么您将得到 Nan。在这种情况下,您应该会收到“无效操作”异常。您确定正确捕获了所有异常吗?看起来数字异常没有被捕获在代码中的某个地方。