【问题标题】:Non integers number binary presentation非整数二进制表示
【发布时间】:2015-01-21 14:36:59
【问题描述】:

java中浮点数的二进制表示是怎样的? 比如(5.34)的二进制表示是什么。

谢谢。

【问题讨论】:

标签: java binary floating-point bit-manipulation


【解决方案1】:

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】:

    通俗地说,浮点数是用 2 的幂来表示的。每个浮点数都包含三个部分。

    • 签收
    • 指数
    • 尾数

    签名部分很容易。它具有负值和正值。使用尾数和指数近似表示的浮点值用于缩放它。有关示例,请参阅following site。您的 5.34 值低于。请注意,它是近似值,正如您在下面看到的,您的数字不是 5.34,而是 5.340000152587891。

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 2018-03-17
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2012-12-01
      • 2016-08-22
      相关资源
      最近更新 更多