首页 文章

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

提问于
浏览
0

所以我试图将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 回答

  • 1

    我已经找出方程式来得出二进制表示的确切数,它是:符号* 2 ^ b-exp *尾数

    编辑:要获得正确的尾数,您只需要从二进制的小数部分开始计算它 . 例如,如果您的分数是011 1111 ......

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

    继续为所有数字执行此操作,您将得到您的尾数 .

  • 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是尾数,包括隐藏位, as integer ; bias = 127和len = 23(尾数位数) .

    那么它变成了:

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

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

相关问题