【问题标题】:Get the "bits" of a float in Python?在 Python 中获取浮点数的“位”?
【发布时间】:2013-01-21 01:01:24
【问题描述】:

我正在寻找与 Java 的 Float.floatToBits 等效的 Python。

我找到了这个Python: obtain & manipulate (as integers) bit patterns of floats,但有人知道更简单的方法吗?

【问题讨论】:

  • 我将如何做相反的事情:Float.BitsToFloat?

标签: python floating-point bitwise-operators


【解决方案1】:

Alex Martelli 在该问题中给出的答案非常简单——您可以将其简化为:

>>> import struct
>>> 
>>> 
>>> def floatToBits(f):
...     s = struct.pack('>f', f)
...     return struct.unpack('>l', s)[0]
...     
... 
>>> floatToBits(173.3125)
1127043072
>>> hex(_)
'0x432d5000'

一旦你将它作为一个整数,你可以执行任何其他你需要的操作。

您可以将操作顺序颠倒为往返:

>>> def bitsToFloat(b):
...     s = struct.pack('>l', b)
...     return struct.unpack('>f', s)[0]

>>> bitsToFloat(0x432d5000)
173.3125

【讨论】:

  • 我没有看到强制执行 big-endian 的必要性。使用 '=' 有什么问题吗?
  • 谢谢。另外我将如何做相反的事情:Float.BitsToFloat?
  • 我不会过于依赖这个断言。试试startVal = 123.456
  • 是的,说得好,我喜欢对人们大喊关于花车上的平等测试。我会删除它。
  • 我喜欢,但有什么不涉及字符串转换的吗?我经常通过分析发现,字符串是最耗时的代码。
【解决方案2】:

这里是python float1 的 64 位小端表示,只是为了补充讨论:

>>> import struct
>>> import binascii
>>> print('0x' + binascii.hexlify(struct.pack('<d', 123.456789)))
0x0b0bee073cdd5e40

参考资料:


[1] 例如,我需要这个专门用于与 intel 上的 .NET 的 BitConverter 的互操作性(即小端序)

【讨论】:

    【解决方案3】:
    >>> import ctypes
    >>> f = ctypes.c_float(173.3125)
    >>> ctypes.c_int.from_address(ctypes.addressof(f)).value
    1127043072
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 2020-04-15
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      相关资源
      最近更新 更多