一个保持类型为非数字 (NaN) 值的常量
double。它相当于返回的值Double.longBitsToDouble(0x7ff8000000000000L)。
这似乎暗示还有其他人。如果是这样,我如何获得它们,这可以便携吗?
为了清楚起见,我想找到这样的double值x
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
和
Double.isNaN(x)
都是真的。
一个保持类型为非数字 (NaN) 值的常量
double。它相当于返回的值Double.longBitsToDouble(0x7ff8000000000000L)。
这似乎暗示还有其他人。如果是这样,我如何获得它们,这可以便携吗?
为了清楚起见,我想找到这样的double值x
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
和
Double.isNaN(x)
都是真的。
你需要doubleToRawLongBits而不是doubleToLongBits.
doubleToRawLongBits提取实际的二进制表示。 doubleToLongBits 没有,它首先将所有NaNs 转换为默认值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 xxxxwherex表示don't care。
所以有很多位模式都是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(指数中的所有位 1 和尾数!= 0)。