Up

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

を得る。

 

Up