2015-08-31 28 views
4

這個問題是後續的this one。在Sun's math library(在C),則表達式在Python中,如何翻譯*(1+(int *)&x)?

*(1+(int*)&x) 

用於檢索浮點數x的高位字。這裏,操作系統被假設爲64位,並且具有小端表示。

我在想如何將上面的C表達式翻譯成Python?這裏的難點在於如何翻譯表達式中的'&'和'*'。順便說一句,也許Python有一些內置函數來檢索浮點數的高位字?

+4

使用'struct.pack()'將它變成一串字節。 – Kevin

+2

爲什麼不把你的答案? – zell

回答

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不能。你可以刪除保證以及,但沒有很好的理由這樣做,因爲它使你的問題變得荒謬。

雖然這可以通過指針算術來完成,但是它會涉及到與​​混淆,並且從Python float到C float的轉換仍然相對昂貴。 struct代碼更容易閱讀。