在python3中将浮点元组转换为数组时的精度损失

问题描述 投票:0回答:1

当我将一个元组或浮点列表转换为带有'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'>

arrays python-3.x precision
1个回答
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一样接近,因为它们在两种情况下都可能获得,只是它们的字符串表示不同。

© www.soinside.com 2019 - 2024. All rights reserved.