测试浮点值是否为NaN

时间:2011-01-20 07:18:46

标签: c floating-point solaris nan

  

可能重复:
  Checking if a double (or float) is nan in C++

我需要检查浮点数是否为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 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:8)

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

if (x != x)
{
    // x is NaN
}

答案 2 :(得分:6)

if(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

答案 3 :(得分:1)

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

FLOAT32 test_NaN = 0x414570A3;

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

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

FLOAT32 test_NaN;
memcpy(&test_NaN, 0x414570A3, 4);