二元浮点数的转换

时间:2014-06-18 07:47:39

标签: python

给定包含小数部分s: 100.0011

的二进制浮点字符串

输出必须为4.1875

我使用了".".join(map(lambda x:str(int(x,2)),s.split('.')))

这会给4.3但不会4.1875

3 个答案:

答案 0 :(得分:3)

将数字拆分为整数和小数部分,然后使用int将每个部分设为十进制,请记住小数部分必须根据其长度进行调整:

>>> s = "100.0011"

>>> d = s.split(".")

>>> int(d[0],2) + float(int(d[1],2)) / 2**len(d[1])
4.1875

0011除以2的长度(2 4 为16)确保它被正确处理( 3 / 16 是0.1875)。

答案 1 :(得分:2)

您可以使用此代码将其转换为小数。不是最有效的,但有效:

s = "100.0011" # binary number
n = s.index(".") # number of positions before the decimal point
r = 0 # result

for digit in s.replace(".", ""): # iterate through each digit ommiting the point '.'
    r += int(digit) * 2 ** (n-1) # multiplicate the digit by the respective power of 2
    n -= 1

print r # 4.1875

这是如何工作的?请记住如何将二进制数转换为十进制数(基数为10):

100.0011  -> 1       0       0   .   0          0          1          1
powerOf 2 ->    4       2       1      1/2        1/4        1/8        1/16
                |       |       |       |          |          |          |
             1*2^2 + 0*2^1 + 0*2^0 + 0*2^(-1) + 0*2^(-2) + 1*2^(-3) + 1*2^(-4)

答案 2 :(得分:-1)

int(x,2)无法理解如何转换小数的小数部分,因为这些值都是负2的幂而不是正2.您可以执行以下操作:

int_, frac = s.split(".")
res = ((int(int_, 2) << len(frac)) + int(frac, 2)) / (2 ** len(frac))