将 64 位二进制浮点数转换为以 10 为底的十进制数

Convert 64-Bit Binary floating-point number into a base 10 decimal

我的任务是将 64 位二进制浮点数 转换为 以 10 为底的十进制数 。 此处示例:

输入: 64位二进制浮点数:0100000000001001001000011111101101010100010001000010110100011000

输出: 以 10 为基数的十进制:3.14

据我所知,第一个字符是一个符号 = 0(正),1(负)。 接下来的11位代表指数,其余为尾数。

我的问题是我不知道转换它的数学方程式或数学解法。我将使用 Java.

来解决这个任务

Double.longBitsToDouble(long) 采用 64 位长并将其转换为浮点双精度数,然后您可以打印它。

鉴于此,您可以只使用 Long.parseLong(binary, 2) 将一串 0 和 1 转换为 long,然后使用该方法获取浮点值。

将二进制转换为 long 值 - 如果您将二进制值作为字符串,则可以使用 Long.parseLong(text, 2)... 然后 Double.longBitsToDouble 执行转换为 double。例如:

public class Test {

  public static void main(String[] args) {
      String text = "0100000000001001001000011111101101010100010001000010110100011000";
      long parsedAsLong = Long.parseLong(text, 2);
      double converted = Double.longBitsToDouble(parsedAsLong);
      System.out.println(converted);
  }

}

这里是解释。正如您已经说过的,主要部分是:

- sign     = 0
- exponent = 10000000000
- mantissa = 1001001000011111101101010100010001000010110100011000

由于所有尾数值都左移(归一化)直到第一位是 1,因此可以隐含该位。所以实际的尾数前缀为 1,值为

- mantissa = 11001001000011111101101010100010001000010110100011000

指数的基数偏移量是1023。上面的指数是 1024,所以指数将是 1 + 隐含位的附加 1

.11 x 22 所以整数部分将是二进制 11 或十进制 3.

double whole = 3;

尾数的其余部分是小数部分,从整数停止的地方开始。

fraction = 001001000011111101101010100010001000010110100011000

所以给定一串如上的位,小数部分可以通过将每个连续的位除以 2 的不断增加的幂来添加到整体中。(e.g. 0/2 + 0/4 + 1/8 + etc)

double div = 1.;
for (char c : fract.toCharArray()) {
     div*=2.;
     whole += (c-'0')/div;
}
System.out.println(whole);

打印

3.141592653589793

注意:上面的代码有点作弊,因为它使用双精度数来计算小数部分。有更多复杂的方法来模拟浮点数学,但这里的目的是演示提取位字段以创建双精度值。如果我这样做,我会使用其他答案中描述的方法。