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