14

可能重复:
检查双精度(或浮点数)是否nan在 C++ 中

我需要检查 float 是否为NaN. 通过浏览一些链接,我发现了最常见的检查。

FLOAT32 f32_test_NaN = (some_value);
if (f32_test_NaN == f32_test_NaN)
{
    //do something;
}
else
{
    // do something;
}

但这似乎对我不起作用。我的代码如下:

FLOAT32 test_NaN = 0x414570A3;//some value - is this ok?

在 GDB 上调试:

(gdb) p test_NaN
$1 = 1.09506982e+09

(gdb) p/x test_NaN
$2 = 0x41457080 // Hex is not same as init value - What is compiler doing?

所以在我的情况下test_NaN等于test_NaN

请让我知道是否必须进行任何编译器设置。我在solaris上运行。或者有没有其他方法可以检查。

提前致谢。

4

4 回答 4

23

包括math.h和使用int isnan(x). 不要忘记链接-lm

于 2011-01-20T07:21:43.407 回答
10

如果<math.h>不可用,请执行以下操作:

if (x != x)
{
    // x is NaN
}
于 2011-01-20T08:29:26.487 回答
7

如果 (x != x)

对于 x = 0x7FBFFFFF(符号位 0,a = 0,其余位 1)

http://en.wikipedia.org/wiki/NaN

IEEE 浮点标准单精度(32 位)NaN 的逐位示例:s111 1111 1axx xxxx xxxx xxxx xxxx xxxx 其中 s 是符号,x 是有效负载,a 确定 NaN 的类型。如果 a = 1,它是一个安静的 NaN;如果 a 为零且有效负载为非零,则它是一个信令 NaN

于 2011-01-20T08:51:06.873 回答
1

问题可能出在您的初始化中(至少这解释了您在 gdb 中看到的值):

FLOAT32 test_NaN = 0x414570A3;

给出的十六进制值被视为整数并转换为浮点数(带有指数和值),这意味着它以不同的格式存储。

如果要强制浮动内的位,则需要 memcpy:

FLOAT32 test_NaN;
memcpy(&test_NaN, 0x414570A3, 4);
于 2011-01-20T08:40:48.020 回答