這個問題是後續的this one。在Sun's math library(在C),則表達式在Python中,如何翻譯*(1+(int *)&x)?
*(1+(int*)&x)
用於檢索浮點數x
的高位字。這裏,操作系統被假設爲64位,並且具有小端表示。
我在想如何將上面的C表達式翻譯成Python?這裏的難點在於如何翻譯表達式中的'&'和'*'。順便說一句,也許Python有一些內置函數來檢索浮點數的高位字?
這個問題是後續的this one。在Sun's math library(在C),則表達式在Python中,如何翻譯*(1+(int *)&x)?
*(1+(int*)&x)
用於檢索浮點數x
的高位字。這裏,操作系統被假設爲64位,並且具有小端表示。
我在想如何將上面的C表達式翻譯成Python?這裏的難點在於如何翻譯表達式中的'&'和'*'。順便說一句,也許Python有一些內置函數來檢索浮點數的高位字?
您可以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不能。你可以刪除保證以及,但沒有很好的理由這樣做,因爲它使你的問題變得荒謬。
雖然這可以通過指針算術來完成,但是它會涉及到與混淆,並且從Python float到C float的轉換仍然相對昂貴。 struct
代碼更容易閱讀。
使用'struct.pack()'將它變成一串字節。 – Kevin
爲什麼不把你的答案? – zell