4

这个问题是这个问题的后续。在Sun 的数学库(C 语言)中,表达式

*(1+(int*)&x)

用于检索浮点数的高位字x。在这里,操作系统假定为 64 位,采用 little-endian 表示。

我在想如何将上面的 C 表达式翻译成 Python?这里的难点是如何翻译表达式中的“&”和“*”。顺便说一句,也许 Python 有一些内置函数可以检索浮点数的高位字?

4

1 回答 1

7

您可以通过以下方式更轻松地做到这一点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代码更容易阅读。

于 2015-08-31T22:58:31.537 回答