为什么这个比较给我“假”呢?我查看了源代码,Float.NaN被定义为
/**
* 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;编辑:令人惊讶的是,如果我这样做:
System.out.println("FC " + (Float.compare(Float.NaN, Float.NaN)));它给了我0。所以Float.compare()确实认为NaN等于它自己!
发布于 2012-02-18 13:38:55
因为Java实现了IEEE-754浮点标准,它保证与NaN的任何比较都将返回false (返回true的!=除外)。
这意味着,您不能以通常的方式检查浮点数是否为NaN,因此可以将这两个数字重新解释为ints并进行比较,或者使用更聪明的解决方案:
def isNan(val):
return val != val发布于 2012-02-18 13:42:01
使用Float.isNaN检查NaN值。
发布于 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都是零)。
https://stackoverflow.com/questions/9341653
复制相似问题