编程语言
首页 > 编程语言> > Python:从两个32位整数创建定点十进制(一个用于int部分,一个用于十进制)

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