将二进制转换为浮点数

时间:2016-06-04 20:22:45

标签: python binary floating-point

我有一个将浮点数编码为二进制的函数。我将浮动数字拆分为"。"并将两个部分转换为二进制。在我连接结果之后。左边的部分我通过简单的转换bin(left_part)进行编码。右边的部分我用下一个算法编码:

    while count:
        val *= 2
        if val >= 1:
            val_bin += "1"
        else:
            val_bin += "0"
        val %= 1
        count -= 1
    return val_bin

我在互联网上找到了这个解决方案。但是我无法找到如何将正确的部分转换为十进制的浮点数。我怎么能这样做?

我只看到完全详尽搜索的方式: 例: 我有" 00110011"。我们从右向左移动。在第一步中,我们有" 1"。这意味着在步骤值中可以是间隔" 1.000到1.999"。在下一步中,我们有另一个" 1"。这意味着第一步中的值是在区间" 1.500到1.999"。在当前步骤中,我们有下一个间隔" 1.001到1.999"。下一步我们有" 0"。这意味着在前一步骤中的值是在区间1.000到1.499"。在所有迭代之后,我们将无法得到准确的结果。结果始终在间隔中。我可能错了。

2 个答案:

答案 0 :(得分:2)

如果您将二进制数作为字符串,并且只想将其解释为小数点右侧的部分,则可以使用此函数:

def binToFloatAfterPoint(b):
    exp = -1
    result = 0
    for digit in b:
        if digit != "0":
            result += math.pow(int(digit)*2,exp)
        exp -= 1
    return result

但是,如果您将整个二进制数作为一个字符串,则可以通过使用此函数指定所需的decimalPlaces数量,将其直接转换为float

def binToFloat(b,decimalPlaces):
    exp = len(b) - decimalPlaces - 1
    result = 0
    for digit in b:
        if digit != "0":
            result += math.pow(int(digit)*2,exp)
        exp -= 1
    return result

所以说你有

b = "1010"

第一个函数(以及decimalPlaces=4的第二个函数)的输出为:0.625 同时,您可以使用decimalPlaces的其他值调用第二个函数,这将为您提供不同的浮点数:

binToFloat(b,0) = 10.0
binToFloat(b,1) = 5.0
binToFloat(b,2) = 2.5
binToFloat(b,3) = 1.25

答案 1 :(得分:1)

这是一个使用内置int函数的版本。它基于以下事实:在任何基数中,十进制扩展的小数部分是分数的分子,其中分母是基数的幂。有问题的力量很容易从小数部分的长度推断出来。

#the following code assumes that '.' appears once

def binToFloat(b):
    parts = b.split('.')
    s,t = parts
    x = 0 if len(s) == 0 else int(s,2)
    y = 0 if len(t) == 0 else int(t,2)
    return x + y/2**len(t)

例如:

>>> binToFloat('1101101.1101')
109.8125

上面的代码假设是Python 3.在Python 2中,您需要将最后一行重写为

return x + float(y)/2**len(t)