当我将元组或浮点列表转换为带有'f'类型代码的数组时,在准确性上存在一些问题,但是使用'd'类型代码将其“正确”运行。
例如:
import array
a = (2.16, -22.4, 95.12, -63.47, -0.02, 1245.2)
b = array.array('f', a)
print(b)
# array('f', [2.1600000858306885, -22.399999618530273, 95.12000274658203, -63.470001220703125, -0.019999999552965164, 1245.199951171875])
c = array.array('d', a)
print(c)
# array('d', [2.16, -22.4, 95.12, -63.47, -0.02, 1245.2])
如您所见,数组c包含与元组a相同的数字,但是数组b存在精度问题。
但是type(b[0])
和type(c[0])
都产生<class 'float'>
。
答案 0 :(得分:1)
实际上,您可能会怀疑准确性没有损失,这是“ Representation Error”的情况。
文字值2.16
没有精确表示为浮点数;解析后,它存储为0x400147AE147AE148
,因为Python always uses double precision(请参阅Numbers.real
)代表浮点数。
然后将值转换为0x400A3D71
(在f
的情况下)或保持不变(在d
的情况下)。这些值对应于2.1600000858306884765625和2.16000000000000014210854715202,这两个值都是人们可以获得的文字2.16
的最准确表示。原始2.16
的精度损失是不可避免的,因为2.16
根本就不存在作为精确值。
在字符串表示形式中看到的是,如果由于舍入is considered acceptable而导致精度损失,则解释器会将基础float / double舍入到接近值。在两种情况下,基础值都尽可能接近2.16
,只是它们的字符串表示形式不同。