这个问题是这个问题的后续。在Sun 的数学库(C 语言)中,表达式
*(1+(int*)&x)
用于检索浮点数的高位字x
。在这里,操作系统假定为 64 位,采用 little-endian 表示。
我在想如何将上面的 C 表达式翻译成 Python?这里的难点是如何翻译表达式中的“&”和“*”。顺便说一句,也许 Python 有一些内置函数可以检索浮点数的高位字?
您可以通过以下方式更轻松地做到这一点struct
:
high_word = struct.pack('<d', x)[4:8]
return struct.unpack('<i', high_word)[0]
这里,high_word
是一个bytes
对象(或 2.x 中的 a ),由小端序(使用 IEEE 64 位浮点格式)str
的四个最高有效字节组成。x
然后我们将它解压成一个 32 位整数(它以单例元组的形式返回,因此是[0]
)。
无论您平台的底层字节序如何,这总是对所有内容使用小端序。如果您需要使用本机字节序,请将 替换为<
(=
并使用>
or!
强制大字节序)。它还保证 64 位双精度和 32 位整数,而 C 不保证。您也可以取消该保证,但没有充分的理由这样做,因为这会使您的问题变得荒谬。
虽然这可以通过指针算术来完成,但它会涉及到混乱,ctypes
并且从 Python 浮点数到 C 浮点数的转换仍然相对昂贵。struct
代码更容易阅读。