ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python:从两个32位整数创建定点十进制(一个用于int部分,一个用于十进制)

2019-08-27 08:58:05  阅读:167  来源: 互联网

标签:python fixed-point


我从具有二进制数据的文件中解压缩了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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有