如何将 IEEE 单精度浮点数转换为十进制值
How to convert an IEEE single precision floating point to a decimal value
所以我正在尝试将 46bfc000(IEEE 单精度浮点数)转换为十进制值。
我可以得到一个近似值,但不能得到精确值。所以这是我的近似值的工作:
1) 转换成二进制:
0100 0110 1011 1111 1100 0000 0000 0000
2) 求 b-exp: 141-127
3) 转换小数后的值: 2^-1 + 2^-5... = .552726746
4) 现在遵循这个等式格式: (1)sign bit * (1. + step 3中的值) * 2^b-exp
5) 计算: +1 X (1.5527226746) X 2^14 = 25439.87501
现在我知道确切的值是:24544。但我想知道是否有办法让我得到确切的数字,或者是否无法将 IEEE 单精度二进制转换为十进制值?
我已经想出方程来得到二进制表示的确切数字,它是:sign * 2^b-exp * mantissa
编辑:要获得正确的尾数,您只需从二进制的小数部分开始计算它。例如,如果您的分数是 011 1111...
那么你会做 (1*2^-0) + (1*2^-1) + (1*2^-2)...
对所有数字继续这样做,您就会得到尾数。
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 and len = 23 (尾数位数).
那么就变成了:
1 * 0xBFC000 * 2^(14-23) = 0xBFC000 / 0x200 = 0x5FE0 = 24544
因为2^(14-23) = 2^-9 = 1 / 2^9 = 1 / 0x200
.
所以我正在尝试将 46bfc000(IEEE 单精度浮点数)转换为十进制值。
我可以得到一个近似值,但不能得到精确值。所以这是我的近似值的工作:
1) 转换成二进制: 0100 0110 1011 1111 1100 0000 0000 0000
2) 求 b-exp: 141-127
3) 转换小数后的值: 2^-1 + 2^-5... = .552726746
4) 现在遵循这个等式格式: (1)sign bit * (1. + step 3中的值) * 2^b-exp
5) 计算: +1 X (1.5527226746) X 2^14 = 25439.87501
现在我知道确切的值是:24544。但我想知道是否有办法让我得到确切的数字,或者是否无法将 IEEE 单精度二进制转换为十进制值?
我已经想出方程来得到二进制表示的确切数字,它是:sign * 2^b-exp * mantissa
编辑:要获得正确的尾数,您只需从二进制的小数部分开始计算它。例如,如果您的分数是 011 1111...
那么你会做 (1*2^-0) + (1*2^-1) + (1*2^-2)...
对所有数字继续这样做,您就会得到尾数。
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 and len = 23 (尾数位数).
那么就变成了:
1 * 0xBFC000 * 2^(14-23) = 0xBFC000 / 0x200 = 0x5FE0 = 24544
因为2^(14-23) = 2^-9 = 1 / 2^9 = 1 / 0x200
.