其他NaN值有哪些?

时间:2010-01-28 12:36:32

标签: java floating-point ieee-754 nan

documentation for java.lang.Double.NaN表示它是

  

保持类型double的非数字(NaN)值的常量。它等同于Double.longBitsToDouble(0x7ff8000000000000L)返回的值。

这似乎暗示还有其他人。如果是这样,我如何抓住它们,这可以移植吗?

要明确,我希望找到doublex,以便

Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)

Double.isNaN(x)

都是真的。

3 个答案:

答案 0 :(得分:8)

您需要doubleToRawLongBits而不是doubleToLongBits

doubleToRawLongBits提取实际的二进制表示。 doubleToLongBits没有,它会先将所有NaN转换为默认NaN

double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0

System.out.printf("%X\n", Double.doubleToLongBits(n));
System.out.printf("%X\n", Double.doubleToRawLongBits(n));
System.out.printf("%X\n", Double.doubleToLongBits(n2));
System.out.printf("%X\n", Double.doubleToRawLongBits(n2));

输出:

7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100

答案 1 :(得分:6)

Java使用IEEE 754作为其浮点数,因此遵循其规则。

根据Wikipedia page on NaN,它的定义如下:

  

IEEE浮点标准单精度NaN的一个逐步示例:x111 1111 1axx xxxx xxxx xxxx xxxx xxxx其中x表示不关心

因此,有很多位模式都是NaN值。

答案 2 :(得分:2)

IEEE 754将NaN定义为一个数字,所有指数位均为1,尾数中为非零数字。

因此,对于您正在寻找的单精度数字:

S     E            M
x  11111111   xxxxxx....xxx (with M != 0)

Java像这样处理:

Double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
Double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0

System.out.println(n.isNaN()); // true
System.out.println(n2.isNaN()); // true
System.out.println(n2 != Double.doubleToLongBits(Double.NaN)); // true

总之,您可以使用任何符合上述规则的NaN(指数中的所有位1和尾数!= 0)。