所以我试图将46bfc000(这是IEEE单精度中的浮点数)转换为十进制值 .
我可以得到一个近似值,但不是确切的值 . 所以这是我的近似值的工作:
1) Convert into binary: 0100 0110 1011 1111 1100 0000 0000 0000
2) Find b-exp :141-127
3) Convert what is after the decimal value :2 ^ -1 2 ^ -5 ... = .552726746
4) Now follow this equation format :(1)符号位*(1 . 步骤3中的值)* 2 ^ b-exp
5) Calculate :1 X(1.5527226746)X 2 ^ 14 = 25439.87501
现在我知道确切的值是:24544 . 但我想知道是否有办法让我得到确切的数字,或者是否无法将IEEE单精度二进制转换为十进制值?
2 回答
我已经找出方程式来得出二进制表示的确切数,它是:符号* 2 ^ b-exp *尾数
编辑:要获得正确的尾数,您只需要从二进制的小数部分开始计算它 . 例如,如果您的分数是011 1111 ......
然后你会做(1 * 2 ^ -0)(1 * 2 ^ -1)(1 * 2 ^ -2)......
继续为所有数字执行此操作,您将得到您的尾数 .
而不是计算逗号后面的所有那些位,即工作,IMO,只需将所有内容缩放2 ^ 23并从指数中减去23以进行补偿 .
这在我的article about floating point for Delphi中有解释 .
首先解码:
插入隐藏位:
十六进制:
0x8D = 141
,减去127
的偏见,变为14
.我喜欢扩展事物,所以计算是:
其中full_mantissa是尾数,包括隐藏位, as integer ; bias = 127和len = 23(尾数位数) .
那么它变成了:
因为
2^(14-23) = 2^-9 = 1 / 2^9 = 1 / 0x200
.