2012-07-31 14 views
1

嗨我有問題解析-0.000000e + 00在Linux上(在Windows上工作)。Python -0.000000e + 00結構包返回錯誤的值

struct.pack("d", -0.000000e+00) 

在linux上struct.pack更改-0.000000e + 00到0.000000e + 00。當我在打包前打印值是正確的,但是struct.pack的結果就像是0.000000e + 00。

有沒有解決這個問題的方法。

我想我需要添加負數女巫是最接近0.如何做到這一點?

EDIT struct.pack("d", -0.000000e+00)結果 '\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X80'

struct.pack("!d", -0.000000e+00)結果 '\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00'

struct.pack("<d", -0.000000e+00)結果 '\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00'

struct.pack(">d", -0.000000e+00)結果 '\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00' 我想要使用「< d」和「> d」。

編輯Sry沒有錯誤。

+0

請發帖[你正在使用的代碼](http://sscce.org/)。對於這個問題,CPU體系結構也可能是相關的。 'struct.unpack('d',struct.pack(「d」,-0.000000e + 00))[0]'在cpython 3.2和2.7的Linux/amd64下工作正常。 – phihag 2012-07-31 08:36:25

回答

1

結構格式字符串"d"以平臺特定的方式對值進行編碼。最有可能的是,解碼字節串的平臺具有不同的endianess或雙倍長度。使用!格式字符強制獨立於平臺的編碼:

>>> struct.pack('!d', -0.) 
b'\x80\x00\x00\x00\x00\x00\x00\x00' # IEEE754 binary64 Big Endian 
>>> struct.unpack('!d', b'\x80\x00\x00\x00\x00\x00\x00\x00')[0] 
-0.0 

還要確保您使用的是支持Python版本。在cPython < 2.5中,結構被稱爲是越野車。更新到當前版本,如2.7或3.2。

+0

它不適合我:(返回\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 – Luffy 2012-07-31 08:47:36

+0

@Luffy您是否確定您已經使用了上述代碼?您是否可以將終端會話的一部分粘貼到[pastebin](http://pastebin.com)左右,還有你運行測試的架構,Linux發行版和Python版本,還要確保你使用'!!'解碼,並且不只是編碼 – phihag 2012-07-31 08:49:15

+0

Python 2.4.3我不知道ATM是什麼架構,但不常見 – Luffy 2012-07-31 08:54:52