首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Float.NaN == Float.NaN

Float.NaN == Float.NaN
EN

Stack Overflow用户
提问于 2012-02-18 13:37:37
回答 3查看 30K关注 0票数 29

为什么这个比较给我“假”呢?我查看了源代码,Float.NaN被定义为

代码语言:javascript
复制
/** 
 * A constant holding a Not-a-Number (NaN) value of type
 * <code>float</code>.  It is equivalent to the value returned by
 * <code>Float.intBitsToFloat(0x7fc00000)</code>.
 */
public static final float NaN = 0.0f / 0.0f;

编辑:令人惊讶的是,如果我这样做:

代码语言:javascript
复制
System.out.println("FC " + (Float.compare(Float.NaN, Float.NaN)));

它给了我0。所以Float.compare()确实认为NaN等于它自己!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-18 13:38:55

因为Java实现了IEEE-754浮点标准,它保证与NaN的任何比较都将返回false (返回true的!=除外)。

这意味着,您不能以通常的方式检查浮点数是否为NaN,因此可以将这两个数字重新解释为ints并进行比较,或者使用更聪明的解决方案:

代码语言:javascript
复制
def isNan(val):
     return val != val
票数 38
EN

Stack Overflow用户

发布于 2012-02-18 13:42:01

使用Float.isNaN检查NaN值。

票数 68
EN

Stack Overflow用户

发布于 2015-09-21 09:36:09

我要说的就是:维基百科关于NaN

它写得很清楚。有趣的是,通用标准的浮点NaN以这种方式表示NaN:

s111 11111xxxxxxxx

S是符号(负数还是正数),1是指数,x是有效载荷。

从有效载荷的角度来看,NaN并不等于任何NaN,而且对于开发人员来说,这些有效负载信息很有可能是有趣的(例如,复数)。

另一件事是,在标准中,他们有信令和相当的NaN。信令NaN (sNaN)是指应该像异常一样引发反应的NaN。它应该用来大声说出你的方程式有问题。安静的NaN (qNaN)是一个静默传递的NaN。

创建信号的sNaN被转换为qNaN,以便在后续操作中不再产生任何信号。请记住,某些系统将i^0 =1定义为NaN^0 =1的常量。因此,有些情况下人们使用NaN进行计算。

因此,最后,我将使用以下内容: qNaN != sNaN,但这是内部的,对用户来说是不可观察的(您不能检查)。混合支付和符号(是的,你可以有负的和正的NaN),在我看来,总是返回NaN != NaN看起来是一个更明智的选择,我终于学会了欣赏->,我再也不会抱怨或怀疑NaN的不平等了。赞美那些考虑周到的人,给我们这么好的标准!

顺便说一句: Java使用了一个有效负载为0的正NaN (所有x都是零)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9341653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档