文件 java.lang.Double.NaN 说是

持有类型的不可以持有的(NAN)值 double. 。它等同于返回的值 Double.longBitsToDouble(0x7ff8000000000000L).

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

要明确,我想找到 doublex 这样

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上的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)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top