Floating point 如何将IEEE单精度浮点转换为十进制值

Floating point 如何将IEEE单精度浮点转换为十进制值,floating-point,floating-point-conversion,Floating Point,Floating Point Conversion,所以我尝试将46bfc000(IEEE单精度中的浮点数)转换为十进制值 我可以得到一个近似值,但不能得到精确值。因此,以下是我的近似值: 1) 转换为二进制: 01000110111111000000 2) 查找b-exp:141-127 3) 转换十进制值后面的内容:2^-1+2^-5…=。552726746 4) 现在遵循以下等式格式:(1)符号位*(1.+步骤3中的值)*2^b-exp 5) 计算:+1 X(1.5527226746)X 2^14=25439.87501 现在我知道确切的数

所以我尝试将46bfc000(IEEE单精度中的浮点数)转换为十进制值

我可以得到一个近似值,但不能得到精确值。因此,以下是我的近似值:

1) 转换为二进制: 01000110111111000000

2) 查找b-exp:141-127

3) 转换十进制值后面的内容:2^-1+2^-5…=。552726746

4) 现在遵循以下等式格式:(1)符号位*(1.+步骤3中的值)*2^b-exp

5) 计算:+1 X(1.5527226746)X 2^14=25439.87501


现在我知道确切的数值是:24544。但是我想知道是否有一种方法可以让我得到精确的数字,或者是不可能将IEEE单精度二进制转换成十进制值吗?

我已经找到了计算二进制表示的精确数字的方程式,它是:符号*2^b-exp*尾数

编辑:要获得正确的尾数,只需从二进制的小数部分开始计算。例如,如果你的分数是0111111

然后你会做(1*2^-0)+(1*2^-1)+(1*2^-2)


继续这样做,所有的数字,你会得到你的尾数

在我看来,与其计算逗号后面的所有位(这是一项非常艰巨的工作),不如将所有内容按2^23进行缩放,然后从指数中再减去23进行补偿

这在我的报告中得到了解释

第一次解码:

0 - 1000 1101 - 011 1111 1100 0000 0000 0000
插入隐藏位:

0 - 1000 1101 - 1011 1111 1100 0000 0000 0000
十六进制:

0 - 8D - BFC000
0x8D=141
,减去
127
的偏差,即成为
14

我喜欢按比例计算,因此计算如下:

sign * full_mantissa * (exp - bias - len)
其中full_尾数是尾数,包括隐藏位,为整数;bias=127,len=23(尾数位数)

那么它就变成了:

1 * 0xBFC000 * 2^(14-23) = 0xBFC000 / 0x200 = 0x5FE0 = 24544

因为
2^(14-23)=2^-9=1/2^9=1/0x200

我不完全确定你所说的“精确数字”是什么意思,但二的每一次幂都可以用有限个十进制数字来表示。因此,如果您在上述计算中使用足够的小数位数,您将得到二进制编码的精确十进制表示形式。我总是发现将其计算为
符号*(2^len+尾数)*2^(exp-bias-len)
,其中尾数是23位整数值,len=23。那么它就变成了
1*0xBFC000*2^(14-23)=0xBFC000/0x200=0x5FE0=24544
。是的,这就是你在问题中作为第4步写的。帕斯卡,你确实是对的。我做这项工作已经很长时间了,所以我被显而易见的答案蒙蔽了双眼。我将对我的答案进行编辑,说明如何计算尾数,因为我的问题计算错了。