Get the “bits” of a float in Python?

后端 未结 3 1270
旧时难觅i
旧时难觅i 2020-12-17 17:39

I am looking for the Python equivalent of Java\'s Float.floatToBits.

I found this Python: obtain & manipulate (as integers) bit patterns of floats

相关标签:
3条回答
  • 2020-12-17 17:54

    Here is the 64-bit, little endian representation of a python float1 just to add to the discussion:

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

    References:

    • struct.pack endianness and byte size format specifiers
    • binascii.hexlify

    [1] for example I needed this specifically for interoperability with .NET's BitConverter on intel (ie little endian)

    0 讨论(0)
  • 2020-12-17 17:54
    >>> import ctypes
    >>> f = ctypes.c_float(173.3125)
    >>> ctypes.c_int.from_address(ctypes.addressof(f)).value
    1127043072
    
    0 讨论(0)
  • 2020-12-17 18:12

    The answer that Alex Martelli gives in that question is really pretty simple -- you can reduce it to:

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

    Once you have it as an integer, you can perform any other manipulations you need to.

    You can reverse the order of operations to round-trip:

    >>> def bitsToFloat(b):
    ...     s = struct.pack('>l', b)
    ...     return struct.unpack('>f', s)[0]
    
    >>> bitsToFloat(0x432d5000)
    173.3125
    
    0 讨论(0)
提交回复
热议问题