其他NaN值是什么?
java.lang.Double.NaN
的文档说它是
一个常量,它包含double
类型的非数字(NaN)值。 它等同于Double.longBitsToDouble(0x7ff8000000000000L)
返回的Double.longBitsToDouble(0x7ff8000000000000L)
。
这似乎意味着有其他人。 如果是这样,我该如何抓住他们,这可以轻松地完成吗?
要清楚,我想找到这样的double
值x
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