其他NAN值是什么?
-
23-09-2019 - |
题
持有类型的不可以持有的(NAN)值
double
. 。它等同于返回的值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("%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上的Wikipedia页面 它是这样定义的:
IEEE浮点标准单精密NAN的一个位示例:
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
在哪里x
方法 不在乎.
因此,有很多patterns NaN
值。
IEEE 754将NAN定义为所有指数位的数字 1
曼蒂萨(Mantissa)中的非零号。
因此,对于单一精确编号,您要寻找:
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(exponent和mantissa!= 0中的所有位1)。
不隶属于 StackOverflow