Python:从两个32位整数创建定点十进制(一个用于int部分,一个用于十进制)
作者:互联网
我从具有二进制数据的文件中解压缩了64位时间戳,其中前32位是秒数,而后32位是秒的小数.我一直坚持如何将底部的32位实际转换为分数,而不是逐位循环.
有什么建议?
仅供参考,编号4ca1f350 9481ef80的翻译为1285682000.580107659
编辑:
对于上下文:数据来自数据包捕获设备,我见过的文档说它的小数部分具有大约纳秒精度(特别是它输出32位中的29位,给出~2ns).
解决方法:
要以足够的精度(32 29 = 61位)表示积分和小数部分的总和,您需要一个十进制(默认为28位十进制数,足以容纳93位),
>>> from decimal import Decimal
>>> Decimal(0x9481ef80) / Decimal(2**32) + Decimal(0x4ca1f350)
Decimal('1285682000.580107659101486206')
或分数(精确),
>>> from fractions import Fraction
>>> Fraction(0x9481ef80, 2**32) + Fraction(0x4ca1f350)
Fraction(43140329262089183, 33554432)
>>> float(_)
1285682000.5801077
请注意,浮点数使用“IEEE双格式”,因此它只能保持53位精度:
>>> a = 0x9481ef80 / 2**32 + 0x4ca1f350
>>> b = 0x9481ef90 / 2**32 + 0x4ca1f350
>>> a == b
如果将小数部分存储为自己的变量就可以了,但如果是这样的话,为什么不保持原样呢?
>>> 0x9481ef80 / 2**32
0.5801076591014862
>>> 0x9481ef90 / 2**32
0.5801076628267765
标签:python,fixed-point 来源: https://codeday.me/bug/20190827/1739112.html