簡體   English   中英

在python中打包和解包二進制浮點數

[英]Packing and Unpacking binary float in 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,)

附加數字是怎么回事? 這是一個舍入誤差嗎? 這是如何運作的?

在大多數平台上,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 struct格式只提供單精度(24位用於顯着精度)

這是一個十進制到二進制的問題。

你知道十進制中的一些分數是如何重復的嗎? 例如,1/3是0.3333333->永遠。 1/7是0.142857142857 [142857] - >永遠。

所以這里是踢球者:重復分數是具有分數的分數,其分數不是10的因子 - 例如不是2和/或5的倍數。

  • 1/2均勻分開
  • 1/3重復
  • 1/4均勻分開
  • 1/5均勻分開
  • 1/6重復
  • 1/7重復
  • 1/8均勻分開
  • 1/9重復
  • 1/10均勻分開
  • 1/11重復
  • 等等

那么現在二進制如何工作? 好吧,它有點糟糕,因為唯一分配的因素是2.除2之外的所有其他素數都會有重復的小數,它們會永遠重復 - 包括十分之一,百分之一等,它們在分母中都有一個因子5 。 1.2345是12345/10000,它在分母中有因子2和5,而5表示你有一個二進制的重復小數,它永遠重復。

但你不能永遠重復。 這意味着您必須舍入小數,以使其適合編碼浮點數的二進制數字。

當您轉換回十進制時,將顯示舍入錯誤。

編碼的結果是: 盡可能晚地計算划分,以防止這些錯誤在每次計算時累積。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM