为什么 Double.NaN==Double.NaN 返回 false?

2022-08-31 07:17:24

我刚刚研究OCPJP问题,我发现了这个奇怪的代码:

public static void main(String a[]) {
    System.out.println(Double.NaN==Double.NaN);
    System.out.println(Double.NaN!=Double.NaN);
}

当我运行代码时,我得到了:

false
true

当我们比较两个看起来彼此相同的事物时,输出如何?这是什么意思?falseNaN


答案 1

NaN的意思是“不是一个数字”。

Java语言规范(JLS)第三版说

溢出的运算产生有符号无穷大,下溢的运算产生非规范化值或有符号零,没有数学上确定结果的运算产生 NaN。所有以 NaN 为操作数的数值运算都会生成 NaN 作为结果。如前所述,NaN 是无序的,因此涉及一个或两个 NaNs 的数字比较运算将返回,而任何涉及 NaN 的比较都将返回 ,包括何时返回 NaN。false!=truex!=xx


答案 2

根据定义,NaN不等于包括NaN在内的任何数字。这是 IEEE 754 标准的一部分,由 CPU/FPU 实现。JVM 不需要添加任何逻辑来支持它。

http://en.wikipedia.org/wiki/NaN

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

Java将所有NaN视为安静的NaN。