所以我试图将46bfc000(这是IEEE单精度中的浮点数)转换为十进制值。
我可以得到一个近似值,但不是确切的值。所以这是我的近似值的工作:
1)转换为二进制文件: 0100 0110 1011 1111 1100 0000 0000 0000
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单精度二进制转换为十进制值?
答案 0 :(得分:1)
我已经计算出等式来得出二进制表示的确切数字,它是:符号* 2 ^ b-exp *尾数
编辑:要获得正确的尾数,您只需要从二进制的小数部分开始计算它。例如,如果您的分数是011 1111 ......
然后你会做(1 * 2 ^ -0)+(1 * 2 ^ -1)+(1 * 2 ^ -2)......
继续为所有数字执行此操作,您将获得尾数。
答案 1 :(得分:1)
不是计算逗号后面的所有位,这是工作的一部分,IMO,只需将所有内容缩放2 ^ 23并从指数中减去23以进行补偿。
我的article about floating point for Delphi解释了这一点。
首先解码:
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_mantissa是尾数,包括隐藏位,为整数; bias = 127和len = 23(尾数位数)。
那么它就变成了:
1 * 0xBFC000 * 2^(14-23) = 0xBFC000 / 0x200 = 0x5FE0 = 24544
因为2^(14-23) = 2^-9 = 1 / 2^9 = 1 / 0x200
。