Python中的数值精度损失

时间:2014-04-29 18:41:39

标签: python floating-accuracy numerical

我希望计算一系列数字的标准误差。假设数字是x[i],其中i = 1 ... N.要做到这一点

我设置

averageX = 0.0
averageXSquared = 0.0

然后我循环遍历所有i = 1,... N并为每个我计算

averageX += x[i]
averageXSquared += x[i]**2

然后我除以N

averageX = averageXC / N
averageXSquared = averageXSquared/N

然后我拿出差异的平方根

stdX = math.sqrt(averageXSquared - averageX * averageX)

此处的参数肯定始终为> = 0。

但是如果我设置了所有x[i] = 0.07(例如),那么我会得到一个数学域错误,因为根函数的参数是负数。似乎有一些精度的损失。

论证的顺序为10e-15。

这看起来并不令人鼓舞。我现在必须检查自己,看看在取根之前结果是否为负。

或者我做错了什么。

2 个答案:

答案 0 :(得分:4)

这不是python问题,而是一般有限精度的问题。如果将所有数字设置为相同的值,则标准错误在数学上为0,但不适用于计算机。处理此问题的正确方法是将非常小的值设置为<0到0。

x = [0.7, 0.7, 0.7]
average = sum(x) / len(x)
sqav = sum(y**2 for y in x) / len(x)
stderr = math.sqrt(max(sqav - average**2, 0))

答案 1 :(得分:2)

正确的方法当然永远不会减去大数字。有另一个传递,它保证非负性(你需要做一些代数才能意识到结果 在数学上是相同的):

y = [ v - average for v in x ]
dev = sum(v*v for v in y) / len(x)
stderr = math.sqrt(dev)