这个问题是这个问题的后续。在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代码更容易阅读。