22

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

4

5 回答 5

25

该方法可以为某些操作返回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()

如果参数是范围0x7ff0000000000001Lthrough0x7fffffffffffffffL或范围 through 中的0xfff0000000000001L任何值0xffffffffffffffffL,则结果是 a NaN。Java 提供的任何 IEEE 754 浮点运算都无法区分具有不同位模式的相同类型的两个 NaN 值。

于 2013-08-26T11:00:44.347 回答
3

来自Java 语言规范

浮点相等性测试根据 IEEE 754 标准的规则执行:

  • 如果任一操作数为 NaN,则 == 的结果为假,但 != 的结果为真。实际上,当且仅当 x 的值为 NaN 时,测试 x!=x 为真。(方法 Float.isNaN 和 Double.isNaN 也可用于测试值是否为 NaN。)

  • 正零和负零被认为是相等的。因此,例如,-0.0==0.0 为真。

  • 否则,相等运算符认为两个不同的浮点值不相等。特别是,有一个值表示正无穷大,一个值表示负无穷大;each 仅与自身比较相等,并且 each 与所有其他值比较不相等。

于 2013-08-26T11:01:46.263 回答
2

因为只有 NaN 将 false 与自身进行比较。NaN因此,当您传递给该方法 时,它将返回 true 。

与 NaN 的比较始终返回无序结果,即使与自身进行比较也是如此。... 等式和不等式谓词是无信号的,因此 x = x 返回 false 可用于测试 x 是否为安静的 NaN。

来源

这不仅与 Java 有关,对于遵循 IEEE754 标准的所有语言也是如此。

相关问题:为什么 Double.NaN==Double.NaN 返回 false?

于 2013-08-26T11:01:14.193 回答
1

简单..Nan总是!= NaN,这些值不等于任何东西。看到这个

如前所述,NaN 是无序的,因此涉及一个或两个 NaN 的数值比较操作返回 false,任何涉及 NaN 的 != 比较都返回 true,包括 x!=x 当 x 为 NaN 时

因此,测试是否v != v足以判断是否value存在NaN

于 2013-08-26T11:05:05.787 回答
0

据我所知,NaN 值不等于任何东西。所以当你通过时float v,它永远不等于它自己。

于 2013-08-26T11:01:54.413 回答