【发布时间】:2015-01-21 14:36:59
【问题描述】:
java中浮点数的二进制表示是怎样的? 比如(5.34)的二进制表示是什么。
谢谢。
【问题讨论】:
-
副本似乎没有回答 OP 的问题,即浮点的表示方式,而不是如何进行转换。
标签: java binary floating-point bit-manipulation
java中浮点数的二进制表示是怎样的? 比如(5.34)的二进制表示是什么。
谢谢。
【问题讨论】:
标签: java binary floating-point bit-manipulation
https://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#longBitsToDouble(long)
如果参数为 0x7ff0000000000000L,则结果为正无穷大。
如果参数为0xfff0000000000000L,则结果为负无穷。
如果参数是 0x7ff0000000000001L 到 0x7fffffffffffffffL 或 0xfff0000000000001L 到 0xffffffffffffffL 范围内的任何值,则结果为 NaN。 Java 提供的任何 IEEE 754 浮点运算都无法区分具有不同位模式的相同类型的两个 NaN 值。 NaN 的不同值只能通过使用 Double.doubleToRawLongBits 方法来区分。
在所有其他情况下,让 s、e 和 m 是可以从参数计算的三个值:
int s = ((bits >> 63) == 0) ? 1 : -1;
int e = (int)((bits >> 52) & 0x7ffL);
long m = (e == 0) ?
(bits & 0xfffffffffffffL) << 1 :
(bits & 0xfffffffffffffL) | 0x10000000000000L;
那么浮点结果等于数学表达式s·m·2e-1075的值。
可以反向进行转换。对于“正常”数字 x,令s 为值的符号,e 为 floor(log2(x)) + 1075,m 从 x/2e 四舍五入, 并适当移动值:s 是高位,e 是接下来的 11 位,m 是剩余的 52 位。
【讨论】:
通俗地说,浮点数是用 2 的幂来表示的。每个浮点数都包含三个部分。
签名部分很容易。它具有负值和正值。使用尾数和指数近似表示的浮点值用于缩放它。有关示例,请参阅following site。您的 5.34 值低于。请注意,它是近似值,正如您在下面看到的,您的数字不是 5.34,而是 5.340000152587891。
【讨论】: