2乗和の計算誤差
平均からの差の2乗和についての次式
の左辺と右辺の値が、コンピュータの計算では異なることがある。これは、桁落ちによるものであるが、例えば、次のプログラムで確認することができる。
d = []
for i in range(4):
d.append(10.0 ** 10 - 3.0 +
2.0 * i)
print(d)
sum = 0.0
ssum = 0.0
for i in range(4):
sum += d[i]
ssum += d[i] ** 2
ssum1 = ssum - (sum ** 2) / 4
print("ssum1 = ", ssum1)
mean = sum / 4
ssum2 = 0.0
for i in range(4):
ssum2 += (d[i] - mean) ** 2
print("ssum2 = ", ssum2)
ssum1が式(1)の右辺の値であり、ssum2が左辺の値である。プログラムを実行すると図1のようになる。
図1
ssum1が0であることは、次のことから理解される。
とおく。
次式
において、
である。また、有効桁数の関係から
となる。倍精度実数の有効桁数は約15桁である。
以上より、
となる。これが、
ssum1=0
の理由である。
他方、
であるので、
ssum2=20
を得る。