其他NaN值是多少?

java.lang.Double.NaN的文档说它是

保持double类型的Not-a-Number(NaN)值的常量。 它等效于Double.longBitsToDouble(0x7ff8000000000000L)返回的Double.longBitsToDouble(0x7ff8000000000000L)

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

要清楚,我想找到doublex这样的

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

 Double.isNaN(x) 

都是真的。

你需要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 

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

根据NaN上的维基百科页面,它定义如下:

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

所以有很多位模式都是NaN值。

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

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

 SEM 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)。