我正在查看openjdk-1.7.0_25源代码,并且看到了此方法:
openjdk-1.7.0_25
/** * Returns {@code true} if the specified number is a * Not-a-Number (NaN) value, {@code false} otherwise. * * @param v the value to be tested. * @return {@code true} if the argument is NaN; * {@code false} otherwise. */ static public boolean isNaN(float v) { return (v != v); }
当此方法可以返回时,我不明白它是如何工作的true?
true
该方法可以对某些操作返回 true ,例如:
System.out.println(Float.isNaN(0.0f / 0.0f)); System.out.println(Double.isNaN(Math.sqrt(-1)));
基本上,NaN代表一个未定义的值。值0.0 / 0.0是NaN,和Nan != NaN。这似乎是合乎逻辑的,因为它Math.sqrt(-1)也给了您NaN。
NaN
0.0 / 0.0
Nan != NaN
Math.sqrt(-1)
请参阅的javadoc Double.NaN:
Double.NaN
它等效于返回的值 Double.longBitsToDouble(0x7ff8000000000000L)
Double.longBitsToDouble(0x7ff8000000000000L)
然后Double.longBitsToDouble():
Double.longBitsToDouble()
如果参数是在范围内的任何值0x7ff0000000000001L通过0x7fffffffffffffffL或在范围0xfff0000000000001L通过0xffffffffffffffffL,其结果是一个NaN。Java提供的IEEE 754浮点运算无法区分具有不同位模式的相同类型的两个NaN值。
0x7ff0000000000001L
0x7fffffffffffffffL
0xfff0000000000001L
0xffffffffffffffffL