测试浮点值是不是为 NaN [重复]

Posted

技术标签:

【中文标题】测试浮点值是不是为 NaN [重复]【英文标题】:Testing if Float value is NaN [duplicate]测试浮点值是否为 NaN [重复] 【发布时间】:2011-06-12 06:43:57 【问题描述】:

可能重复:Checking if a double (or float) is nan in 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上运行。或者有没有其他方法可以检查。

提前致谢。

【问题讨论】:

***.com/questions/570669/… 为什么不使用 math.h 中的isnan()?有什么特别的原因吗? 该标准功能在环境中不可用。 不是骗子——这是关于 C,而不是 C++ 标题可能具有误导性——它是关于一个所谓的nan 不是nan 毕竟。 【参考方案1】:

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

【讨论】:

也许应该补充一点,这个“唯一”出现在 C99 中,所以并不是所有的编译器都可以实现这个。 suncc 支持它,这似乎是提问者使用的。 其实isnan 不是一个函数,至少在包含math.h 之后使用它时:它是一个具有实现定义定义的宏。【参考方案2】:

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

if (x != x)

    // x is NaN

【讨论】:

谢谢,我正在做同样的事情,但可能我没有正确初始化。你能告诉我我可以用什么值来初始化 'x' 来测试 NaN 吗? @kp11 任何浮点表达式都可以。【参考方案3】:

如果 (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

【讨论】:

【参考方案4】:

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

FLOAT32 test_NaN = 0x414570A3;

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

如果你想强制浮动里面的位,那么你需要memcpy:

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

【讨论】:

酷!我知道问题在那里。但是 memcpy 为我崩溃了。因此,就是这样做了,它奏效了!! UINT32 test_NaN[2] = 0xffffffff,0xfffffff7; FLOAT32 test = ( FLOAT32 )test_NaN;(没有在 cmets 中显示指针 (?!?)) 您的代码不正确。 memcpy 必须从地址复制。所以首先将 0x414570A3 存储在一个 int 变量中。

以上是关于测试浮点值是不是为 NaN [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中用 NaN 替换浮点值?

c ++函数在返回时将浮点值转换为NaN

Objective-C - 对 nan 进行浮点检查

这三个特殊的浮点值是啥意思:正无穷大、负无穷大、NaN?

如何在包含浮点数和 Nan 或 None 值的同一列中舍入浮点值?

对于包含无效值的数据集,我应该使用浮点的 NaN 还是浮点 + bool?