溢出的操作产生有符号无穷大,下溢的操作产生非规范化值或有符号零,而没有数学上确定的结果的操作产生 NaN。所有以 NaN 作为操作数的数值操作最终都会产生 NaN。如前所述,NaN 是无序的,因此涉及一个或两个 NaN 的数值比较操作返回 false,任何涉及 NaN 的 !=比较返回 true,当 x为 NaN 时包括 x!=x。
NaN代表 Not a Number。什么不是数字?什么都行。你可以在一边有任何东西,在另一边有任何东西,所以没有什么能保证两者是平等的。NaN是用 Double.longBitsToDouble(0x7ff8000000000000L)计算的,正如你在 longBitsToDouble的文档中看到的:
/**
* A constant holding a Not-a-Number (NaN) value of type
* {@code double}. It is equivalent to the value returned by
* {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
*/
public static final double NaN = 0.0d / 0.0;
顺便说一下,NaN是作为您的代码示例进行了测试:
/**
* 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 value of the argument is NaN;
* {@code false} otherwise.
*/
static public boolean isNaN(double v) {
return (v != v);
}
0 11111111 0000000000000000010000000000000000000000000000000000 = NaN
1 11111111 0000010000000000010001000000000000001000000000000000 = NaN
1 11111111 0000010000011000010001000000000000001000000000000000 = NaN