这个问题是this one的后续行动。在Sun's math library(在C中),表达式
*(1+(int*)&x)
用于检索浮点数x
的高位字。这里,OS假定为64位,具有little-endian表示。
我在考虑如何将上面的C表达式翻译成Python?这里的难点在于如何翻译表达式中的'&'和'*'。顺便说一句,也许Python有一些内置函数可以检索浮点数的高位字?
答案 0 :(得分:7)
您可以使用struct
更轻松地完成此操作:
high_word = struct.pack('<d', x)[4:8]
return struct.unpack('<i', high_word)[0]
此处,high_word
是bytes
对象(或2.x中的str
),以小端序排列x
的四个最重要字节组成(使用IEEE 64位浮点格式)。然后我们将它解包回一个32位整数(在单个元组中返回,因此[0]
)。
无论您的平台的底层字节如何,这总是使用little-endian。如果您需要使用原生字节序,请将<
替换为=
(并使用>
或!
强制使用大端。它还保证64位双精度和32位整数,而C则不然。您也可以删除该保证,但没有充分的理由这样做,因为它会使您的问题荒谬。
虽然这可以通过指针算法完成,但它会涉及到ctypes
,并且从Python float到C float的转换仍然相对昂贵。 struct
代码更容易阅读。