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