zel*_*ell 4 c python floating-point bit-representation
这个问题是一个跟进这一个.在Sun的数学库(在C中),表达式
*(1+(int*)&x)
Run Code Online (Sandbox Code Playgroud)
用于检索浮点数的高位字x.这里,OS假定为64位,具有little-endian表示.
我在想如何将上面的C表达式翻译成Python?这里的困难是如何翻译表达式中的'&'和'*'.顺便说一句,也许Python有一些内置函数可以检索浮点数的高位字?
您可以更轻松地做到这一点struct:
high_word = struct.pack('<d', x)[4:8]
return struct.unpack('<i', high_word)[0]
Run Code Online (Sandbox Code Playgroud)
这里,high_word是一个bytes对象(或str2.x),由x小端序的四个最重要的字节组成(使用IEEE 64位浮点格式).然后我们将它解压缩回一个32位整数(在单例元组中返回,因此[0]).
无论您的平台的底层字节如何,这总是使用little-endian.如果需要使用本机字节序,请替换<with =(并使用>或!强制使用big endian).它还保证64位双精度和32位整数,而C则不然.您也可以删除该保证,但没有充分的理由这样做,因为它使您的问题荒谬.
虽然这可以通过指针算法完成,但它会涉及到乱码,ctypes从Python float到C float的转换仍然相对昂贵.该struct代码更易于阅读.