2

我有这个 32 位二进制数(00111111010000000000000000000000),我想知道如何将它转换为浮点数。

在不使用编程或转换器的情况下,如何手动将这个 32 位二进制数转换为浮点数?

谢谢,

4

2 回答 2

10

假设您正在寻找一个浮点数,格式如下:

第一个数字是符号,接下来的 8 是指数,最后,最后 23 是有效数。

对于您的号码(00111111010000000000000000000000)

符号:0 是 +
指数:01111110 是 -1 (126-127)
有效数:10000000000000000000000 是 1.5(“不可见”的第一位给你 1,然后第二位(只有一组)是 0.5,下一位是0.25,然后是 0.125 等等)

然后,您可以这样计算值:

sign * 2^exp * Significand

1 * 2^-1 * 1.5
1 * 0.5 * 1.5
0.75

你的浮点数等于 0.75。

于 2013-01-24T15:17:24.543 回答
2

如果您在维基百科和其他地方进行一些查看,您将了解到浮点标准(有不同的标准,IEEE754 是最广为人知的,因为它用于桌面等(dsp 有时会有自己的计算速度更快))将“标准化”数字。浮点数是关于小数点的位置,非浮点整数在数字右侧有一个隐含的小数点

00111111010000000000000000000000. <--- here

除了要归一化的全零之外,假设我们使用的格式希望数字为二进制 1.xxxx,因此我们需要移动小数点

001.11111010000000000000000000000

小数位被移动到最重要的位之后(因此只有一个 1 位于小数点左侧)。

如果您还记得高中数学中的 123 可以写为 1.23 * 10^2(10 的 2 次方)。123 也是 123 * 10^0。以 10 为基数的小数点每左移一位,10 的幂就会增加一。右边的每个地方都会减少。在以 2 为底的二进制中没有什么不同,您将小数点向左移动的每一位都会增加 2 的幂(二进制是以 2 为底的)每个位置向右,您都会减少 2 的幂。

所以准确地说,我们现在的数字是

1.1111101 * 2^30

现在浮点格式的细节开始发挥作用。因为假设小数点左边的 1(除了确切的数字零和其他一些例外)在那里,它有时不在该浮点数的最终二进制表示中,这是浪费空间当我们可以为尾数多放一点时,我们知道总是放一点。尾数通常是二进制中所见即所得的,指数是让你摸不着头脑的那个,尤其是 IEEE754。例如,数字的二进制格式中的 128 的指数可能表示 2 的 0 次幂,而 129 可能是 2 的 1 次幂,依此类推。这可能看起来很奇怪,但对于其中一些格式来说,它只不过是一个二进制补码字段,而其他格式则有其他方式来做事。单人、双人、

另一个例子

0000000000000000000000000000000000000101

将会

1.01 * 2^2

如果您从 32 位整数(不是浮点数)开始并希望以 32 位浮点数结束,您显然无法保留该数字的所有细节,因为浮点数需要一个符号位和一个指数以及尾数,尾数小于 32 位,所以你扔掉最低有效位

1000000000000000000000000000001  

会在某个时候被砍掉:

1.000000000000000 * 2^something
于 2013-01-24T15:18:49.233 回答