1
我正在实施Arithmetic Encoder & Decoder。它的一个子模块涉及将定点值转换为二进制,反之亦然。从二进制字符串检索定点值
要编码的字符串相当长,因此我必须考虑很多精度= 250
。一旦我有一个Decimal
值;它正在转换为二进制字符串(def decimal_to_binary_str
)。问题是要从二进制文件def binary_str_to_decimal
中检索Decimal
值。有人能指出这个问题吗?
import decimal
def decimal_to_binary_str(f, l):
res = ""
var = f - int(f)
while var != 0 and len(res) < l:
var = var*2
res += '{0:.250f}'.format(var)[0]
var = var - int(var)
return res
def binary_str_to_decimal(bit_str):
a = decimal.Decimal(0)
b = decimal.Decimal(1)
res = decimal.Decimal(0.5)
for j in bit_str:
if j == '0':
b -= (b-a)/2
res = res - (b-a)/2
elif j == '1':
a += (b-a)/2
res = res + (b-a)/2
return res
if __name__ == "__main__":
decimal.setcontext(decimal.Context(prec=250))
f = decimal.Decimal('0.2157862006526829178278743649908677246339070461540076509576931506281654871337287537411826845238756634211771470806684727059082493570941004017476336218118077112203256327565095923853074403357680122784788435203804147809638828466085270584355766316314164101')
print f
b = decimal_to_binary_str(f, 669)
print binary_str_to_decimal(b)
'''
I have marked with pipe symbol(|) the difference in what is retrieved and what was the original.
Output:
0.215786200652682917827874364990867724633907046154007650957693150628165487133728753741182684523875663421177147080668472705908249357094100401747633621811807711220325632756509592385307440335768012278478843|5203804147809638828466085270584355766316314164101
0.215786200652682917827874364990867724633907046154007650957693150628165487133728753741182684523875663421177147080668472705908249357094100401747633621811807711220325632756509592385307440335768012278478843|3376547904539139004978887353289003223234434034223
'''
“小数”实际上是固定点,而不是浮点数。 – 2014-09-12 22:24:50
已修改。谢谢! – ajmartin 2014-09-12 22:32:18
你如何处理像'decimal.Decimal('0.1')'' – 2014-09-12 22:42:11