I am having some trouble with packing and unpacking of binary floats in python when doing a binary file write. Here is what I have done:
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()
The result I get is the following:
(1.2345600128173828,)
What is going on with the extra digits? Is this a rounding error? How does this work?
On most platforms, Python floats are what C would call a double
, but you wrote your data out as float
instead, which has half the precision.
If you were to use double
, you'd have less precision loss:
>>> data = struct.pack('d',value)
>>> struct.unpack('d',data)
(1.23456,)
>>> data = struct.pack('f',value)
>>> struct.unpack('f',data)
(1.2345600128173828,)
The float
struct format offers only single precision (24 bits for the significant precision).