在测试我的库Construct时,我发现在构建数字时测试失败然后解析回浮点数。浮点数不能完全表示为内存浮点数吗?
In [14]: d = struct.Struct("<f")
In [15]: d.unpack(d.pack(1.23))
Out[15]: (1.2300000190734863,)
答案 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,)
格式:
f
,C类型:float
,Python类型:float
,标准尺寸:4
,脚注:(5)
格式:d
,C类型:double
,Python类型:float
,标准大小:8
,脚注:(5)
- 对于
醇>'f'
和'd'
转换代码,压缩表示使用IEEE 754 binary32(对于'f'
)或binary64(对于'd'
)格式,而不管平台使用的浮点格式。