struct.unpack(struct.pack(float))有舍入错误?

时间:2016-09-21 14:37:49

标签: python floating-point pack

在测试我的库Construct时,我发现在构建数字时测试失败然后解析回浮点数。浮点数不能完全表示为内存浮点数吗?

In [14]: d = struct.Struct("<f")

In [15]: d.unpack(d.pack(1.23))
Out[15]: (1.2300000190734863,)

1 个答案:

答案 0 :(得分:6)

浮点本质上是不精确的,但是你将双精度浮点数(binary64)打包到那里的单精度(binary32)空间中。请参阅维基百科有关IEEE浮点格式的文章中的Basic and interchange formats; Python float格式使用双精度(请参阅standard types docs; 浮点数通常在C 中使用double实现。)

使用d使用双精度:

>>> import struct
>>> d = struct.Struct("<d")
>>> d.unpack(d.pack(1.23))
(1.23,)

来自Format characters section

  

格式:f,C类型:float,Python类型:float,标准尺寸:4,脚注:(5)
  格式:d,C类型:double,Python类型:float,标准大小:8,脚注:(5)

     
      
  1. 对于'f''d'转换代码,压缩表示使用IEEE 754 binary32(对于'f')或binary64(对于'd')格式,而不管平台使用的浮点格式。
  2.