2013-04-23 100 views
4

我在執行二進制文件寫入時在python中打包和解壓二進制浮點數時遇到了一些麻煩。下面是我做了什麼:在python中打包和解壓縮二進制浮點數

import struct 

f = open('file.bin', 'wb') 
value = 1.23456 
data = struct.pack('f',value) 
f.write(data) 
f.close() 

f = open('file.bin', 'rb') 
print struct.unpack('f',f.read(4)) 
f.close() 

結果我得到的是以下幾點:

(1.2345600128173828,) 

這是怎麼回事與額外的數字?這是一個舍入錯誤?這個怎麼用?

+1

是的,浮點數本質上是不精確的。 – 2013-04-23 09:16:35

+5

有關完整* why *的信息,請參閱[每位計算機科學家應瞭解的浮點算術知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 – 2013-04-23 09:17:12

+2

您遇到的Python教程[總結表示問題](http://docs.python.org/2/tutorial/floatingpoint.html#representation-error)。 – 2013-04-23 09:20:28

回答

6

在大多數平臺上,Python浮點數是C所稱的double,但是您將數據寫爲float而不是精度的一半。

如果你使用double,你必須精確度損失少:

>>> data = struct.pack('d',value) 
>>> struct.unpack('d',data) 
(1.23456,) 
>>> data = struct.pack('f',value) 
>>> struct.unpack('f',data) 
(1.2345600128173828,) 

float結構格式只提供single precision (24 bits for the significant precision)

+0

這很有道理......如果我理解正確,那意味着浮點部分不會比0.8388607更精確。這使得它只有不到7個小數位?我明白,指數允許更廣泛的數字範圍。 – Wilsonator 2013-04-23 09:33:24

+0

另外我假設「(1.2345600128173828,)」只是顯示比實際數據類型更精確的python打印函數呢? – Wilsonator 2013-04-23 09:34:28

+0

'0.8388607',你從哪裏得到這個數字?打印功能沒有顯示「更精確」,它只是將存儲的實際值轉換爲十位數。 – phant0m 2013-04-23 09:34:50