一尘不染

Java isNan是如何工作的?

java

我正在查看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


阅读 319

收藏
2020-12-03

共1个答案

一尘不染

该方法可以对某些操作返回 true ,例如:

System.out.println(Float.isNaN(0.0f / 0.0f));
System.out.println(Double.isNaN(Math.sqrt(-1)));

基本上,NaN代表一个未定义的值。值0.0 / 0.0NaN,和Nan != NaN。这似乎是合乎逻辑的,因为它Math.sqrt(-1)也给了您NaN

请参阅的javadoc
Double.NaN

它等效于返回的值 Double.longBitsToDouble(0x7ff8000000000000L)

然后Double.longBitsToDouble()

如果参数是在范围内的任何值0x7ff0000000000001L通过0x7fffffffffffffffL或在范围0xfff0000000000001L通过0xffffffffffffffffL,其结果是一个NaN。Java提供的IEEE
754浮点运算无法区分具有不同位模式的相同类型的两个NaN值。

2020-12-03