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)

  1. 对于'f''d'转换代码,打包表示使用IEEE 754 binary32(for 'f')或binary64(for
    'd')格式,而与平台使用的浮点格式无关。