其他NaN值是什么?

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

一个常量,它包含double类型的非数字(NaN)值。 它等同于Double.longBitsToDouble(0x7ff8000000000000L)返回的Double.longBitsToDouble(0x7ff8000000000000L)

这似乎意味着有其他人。 如果是这样,我该如何抓住他们,这可以轻松地完成吗?

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

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

Double.isNaN(x)

都是真的。


您需要doubleToRawLongBits而不是doubleToLongBits

doubleToRawLongBits提取实际的二进制表示。 doubleToLongBits没有,它会将所有NaN s到默认NaN第一。

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

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

输出:

7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100

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

根据NaN上的Wikipedia页面,它是这样定义的:

IEEE浮点标准单精度NaN的按位示例: x111 1111 1axx xxxx xxxx xxxx xxxx xxxx其中x表示不关心。

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


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(指数和尾数!= 0中的所有位1)。

链接地址: http://www.djcxy.com/p/58489.html

上一篇: What are the other NaN values?

下一篇: eql? behavior after redefining Object#hash