我有这个 32 位二进制数(00111111010000000000000000000000),我想知道如何将它转换为浮点数。
在不使用编程或转换器的情况下,如何手动将这个 32 位二进制数转换为浮点数?
谢谢,
担
我有这个 32 位二进制数(00111111010000000000000000000000),我想知道如何将它转换为浮点数。
在不使用编程或转换器的情况下,如何手动将这个 32 位二进制数转换为浮点数?
谢谢,
担
假设您正在寻找一个浮点数,格式如下:
第一个数字是符号,接下来的 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。
如果您在维基百科和其他地方进行一些查看,您将了解到浮点标准(有不同的标准,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