如何将32位二进制数转换为浮点数?

时间:2013-01-24 15:00:22

标签: floating-point binary

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

不使用编程或转换器,如何手动将此32位二进制数转换为浮点数?

谢谢,

2 个答案:

答案 0 :(得分:10)

假设您正在寻找单个浮点,请使用以下格式:

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

您的号码(00111111010000000000000000000000)

签收:0是+
指数:01111110是-1(126-127)
意义:10000000000000000000000是1.5('隐形'第一位给你1,然后第二位(只有一组)是0.5,下一个是0.25,然后是0.125等等)

然后你计算这样的值:

签字* 2 ^ exp *显着

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

浮点数等于0.75。

答案 1 :(得分:2)

如果你去浏览维基百科和其他地方,你将学到的是浮点标准(有不同的标准,IEEE754最常见,因为它用于台式机等等)(dsp会有它们的自己有时会更快地计算))将“标准化”数字。浮点是关于小数点的位置,非浮点整数在数字的右边有一个隐含的小数点

00111111010000000000000000000000. <--- here

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

001.11111010000000000000000000000

小数位在最重要的位置之后移动(因此小数点的左边只有一个1位)。

如果你记得从高中的数学123可以写成1.23 * 10 ^ 2(10到2的权力)。 123也是123 * 10 ^ 0。在基数为10的数字中左移小数的每个位置都会将10的幂增加1。右边的每个地方都减少了。基数为2的二进制没有区别,每个位置你移动小数点左边你增加2的幂(二进制是基数2)每个地方正确,你减少2的幂。

所以为了准确我们的号码现在是

1.1111101 * 2^30

现在浮点格式的细节开始发挥作用。因为小数点左边的1(除了确切的数字零和其他一些例外)被假定在那里,它有时不在该浮点数的最终二进制表示中,这是浪费空间我们知道的总是一个当我们可以为尾数再多一点时。 mantissas通常是二进制中的wysiwyg,指数是让你挠头的因素,特别是IEEE754。例如以数字的二进制格式表示128的指数可以表示2到功率0,129可以是2到功率1,依此类推。这可能看起来很奇怪,但它只不过是其中一些格式的二重补充字段,其他方式也可以做其他事情。单,双,扩展对指数有不同的位数,你需要弄清楚你添加到实指数(在这种情况下为30)的内​​容,以获得浮点数的指数字段中的位模式。 / p>

另一个例子

0000000000000000000000000000000000000101

将是

1.01 * 2^2

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

1000000000000000000000000000001  

会在某些时候被切断:

1.000000000000000 * 2^something