【问题标题】:converting float to fixed point in python在python中将浮点数转换为定点
【发布时间】:2016-01-12 21:06:18
【问题描述】:

我想我想多了这个问题,但我似乎无法解决它。我正在从文件(范围(-1,1))中读取小端浮点数,并希望将它们转换为定点 32b。

如果我读入值 0xA0C1943B,则相当于 0.0045396835 的浮点数。如果我想将其表示为 fixed32_31,则为 0x00129834。

python中有没有一种简单的方法可以从0xA0C1943B到0x00129834?

【问题讨论】:

  • 你能解释一下什么是定点格式吗?总共有多少位,重点在哪里?对于您提供的示例值,固定表示是通过将浮点数缩放 2**28 然后四舍五入到最接近的 int 来获得的。那 28 是从哪里来的?

标签: python floating-point type-conversion fixed-point


【解决方案1】:

您可以将定点整数视为分数的分子,可能会应用偏差。在您的情况下,您希望-1.0 映射到-INT_MAX,并且1.0 映射到INT_MAX(即2**31 - 1)。

代数曲柄转几圈给我们:

fixed = int(flt * (INT_MAX/2))

请注意,此处的舍入并不完美。如果您关心 -1.0、0.0 和/或 1.0 的确切行为,则适用稍微复杂一些的公式。

【讨论】:

  • 谢谢,但我想我们可能不在同一个页面上。我可以不包括 -1 和 1 在我的范围内(所以它纯粹是一个分数),所以固定值的整数部分只是符号位。当我在浮点数 0.00453968346119 上运行您的算法时,我得到十六进制值 0x8094c19e。那是 32b,但在固定 表示中是负值。
  • @toozie21 啊,所以您使用的是签名表示。我会更新答案。
  • 我完全错过了你的变量中的无符号 U,这会帮助我了解。但我仍然认为缺少一些东西。对于我的 0.00453968346119 浮点数,我得到一个 0x4a60cf 的十六进制数,而对于 -0.00708158267662 的浮点数,它给出了一个 -0x74064f 的十六进制数。这两个在 MSb 中都有一个 1,这将使它们都是负数。我猜添加负号是在做一些我需要考虑的事情。
  • 0x4a60cf,作为 32 位整数,MSB 为 0。它的二进制表示为00000000010010100110000011001111。“-0x74064f”不是十六进制常量的正常表示方式,但推测它只是表示-7603791,二进制表示为11111111100010111111100110110001。
【解决方案2】:

相信你想用pythonstruct模块:

import struct
print struct.pack('<f', some_float)

'&lt;f' 是一个格式字符串,代表一个小端浮点数(4 个字节)。 如果这不适合您,请查看文档以了解适合您的格式。

https://docs.python.org/2/library/struct.html

【讨论】:

  • 嗯,这可能是我想太多的地方。我实际上是在使用您的命令读取值。我可以打印出该值,它看起来不错,但我认为它可能仍作为“浮点数”存储在变量中。如果我想去一​​个固定值,那是我认为我需要进行转换的地方......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多