struct.unpack(struct.pack(float))是否具有舍入错误?
问题内容:
在测试我的库Construct时,我发现在构建数字然后将其解析回浮点数时测试失败。浮点数是否应该不完全代表内存中的浮点数?
In [14]: d = struct.Struct("<f")
In [15]: d.unpack(d.pack(1.23))
Out[15]: (1.2300000190734863,)
问题答案:
浮点在本质上是不精确的,但是您要将双精度float(binary64
)打包到binary32
那里的单精度()空间中。请参阅Wikipedia中有关IEEE浮点格式的文章中的
基本格式和互换
格式;Pythonfloat
格式使用双精度(请参阅标准类型docs; 浮点数通常使用C中的double实现 )。
使用d
使用双精度:
>>> import struct
>>> d = struct.Struct("<d")
>>> d.unpack(d.pack(1.23))
(1.23,)
在 格式字符 部分:
格式:
f
,C类型:float
,Python类型:float
,标准尺寸:4
,脚注:(5)
格式:d
,C类型:double
,Python类型:float
,标准尺寸:8
,脚注:(5)
- 对于
'f'
和'd'
转换代码,打包表示使用IEEE 754 binary32(for'f'
)或binary64(for
'd'
)格式,而与平台使用的浮点格式无关。