我有一个将浮点数编码为二进制的函数。我将浮动数字拆分为"。"并将两个部分转换为二进制。在我连接结果之后。左边的部分我通过简单的转换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"。在所有迭代之后,我们将无法得到准确的结果。结果始终在间隔中。我可能错了。
答案 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)