(浮动)NAN 是不是有普遍接受的值 [关闭]
Posted
技术标签:
【中文标题】(浮动)NAN 是不是有普遍接受的值 [关闭]【英文标题】:Is there a universally accepted value for a (float) NAN [closed](浮动)NAN 是否有普遍接受的值 [关闭] 【发布时间】:2016-10-01 15:52:29 【问题描述】:(float) #NAN ("Not A Number") 是普遍分配的值 0x7F A0 00 00 还是不同编译器不同?
【问题讨论】:
没有。取决于语言、编译器等。以后请不要标记Java、C和C++,因为它们是三种完全不同的语言。 java 还是 c 还是 c++?我觉得不一样。 来自this article:“提供了两种不同的 NaN,称为静默 NaN 和信号 NaN。” 您似乎在谈论 NaN 的底层机器表示,它不是由语言定义的,而是由硬件制造商和他们遵循的任何标准(例如 IEEE FP 标准)定义的. 没有。它因硬件、语言、编译器等而异。没有标准的 NAN 表示。 【参考方案1】:没有。如果就浮点数而言,在普遍接受某些东西的方向上发生了什么事,那将是相关的 IEEE 标准,但即使是这个标准也允许变化:
https://en.wikipedia.org/wiki/NaN
【讨论】:
来自 Mikes 链接:“例如,按位 IEEE 浮点标准单精度(32 位)NaN 将是:s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx”所以最好的解决方法在通信中检测 NAN 的方法是寻找第一个字节为 0x7F 而忽略其他 3 个字节。 Java 1.8.0_102 (NetBeans IDE 8.1) 如何看待这个世界:0x7F 00 00 00 返回“浮点值为 170141183460469230000000000000000000000.000000”。 0x7F 80 00 00 返回“浮点值为无穷大”。 0x7F A0 00 00 返回“浮点值为 NaN” @Harvard 和 Java 使用 IEEE 754 的子集,您可能会假设更多使用 c 和 c++ 的平台也这样做。 (不能保证,但很有可能)【参考方案2】:IEEE 754(“IEEE 浮点”)将所有具有最大指数值和有效数字中的任何非零位的表示定义为 NAN。因此,单精度的有效测试是:
uint32_t repr;
memcpy(&repr, &f, sizeof repr);
if ((repr & 0x7fffffff) > 0x7f800000) //...
在 C 中,如果您不假设 IEEE 算术,2.0+2.0==5.0
是可能的,所以在实践中我们很多人确实假设它。它由标准的可选附件 F 指定。
【讨论】:
以上是关于(浮动)NAN 是不是有普遍接受的值 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章