在Python中,我如何翻译*(1+(int *)& x)?

时间:2015-08-31 22:38:30

标签: python c floating-point bit-representation

这个问题是this one的后续行动。在Sun's math library(在C中),表达式

*(1+(int*)&x)

用于检索浮点数x的高位字。这里,OS假定为64位,具有little-endian表示。

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

1 个答案:

答案 0 :(得分:7)

您可以使用struct更轻松地完成此操作:

high_word = struct.pack('<d', x)[4:8]
return struct.unpack('<i', high_word)[0]

此处,high_wordbytes对象(或2.x中的str),以小端序排列x的四个最重要字节组成(使用IEEE 64位浮点格式)。然后我们将它解包回一个32位整数(在单个元组中返回,因此[0])。

无论您的平台的底层字节如何,这总是使用little-endian。如果您需要使用原生字节序,请将<替换为=(并使用>!强制使用大端。它还保证64位双精度和32位整数,而C则不然。您也可以删除该保证,但没有充分的理由这样做,因为它会使您的问题荒谬。

虽然这可以通过指针算法完成,但它会涉及到ctypes,并且从Python float到C float的转换仍然相对昂贵。 struct代码更容易阅读。