Up

有効桁数による和の精度のチェック例

 

 コンピュータ上で表されている数値の有効桁数のため、同じものをN回足してもN倍になるとは限らない(J. F. Monahan, “Numerical methods of statistics”, 2010)。例えば、に対して

                           

となるNが存在する。このとき、他の値Mに対して

                           

であれば、

(1)                 

である。

 これらのことを確認するC++プログラムを以下のように作成した。

 

#include <iostream>

 

using namespace std;

 

int main(){

        float x = 1.0, x0, step = 1.0;

        do{

                x0 = x;

                step *= 0.1;

                cout << step << endl;

                x += step;

        }while(x0 != x);

        float sum = 0.0;

        for (int i = 0; i < 1000; i++)

                for (int j = 0; j < 1000; j++)

                        sum += 1.0;

        cout << "sum(1000:1000) = " << sum << endl;

        sum = 0.0;

        for (int i = 0; i < 10000; i++)

                for (int j = 0; j < 10000; j++)

                        sum += 1.0;

        cout << "sum(10000:10000) = " << sum << endl;

        sum = 0.0;

        for (int i = 0; i < 20000; i++)

                for (int j = 0; j < 20000; j++)

                        sum += 1.0;

        cout << "sum(20000:20000) = " << sum << endl;

        return 0;

}

 

上のプログラムをLinux (CentOS 5.5)上で実行すると端末(コンソール)画面出力として以下のものが表示された。

 

[yasuharu@localhost CheckFloat]$ g++ -o checkFloat checkFloat.cpp

[yasuharu@localhost CheckFloat]$ ./checkFloat

0.1

0.01

0.001

0.0001

1e-05

1e-06

1e-07

1e-08

sum(1000:1000) = 1e+06

sum(10000:10000) = 1.67772e+07

sum(20000:20000) = 1.67772e+07

[yasuharu@localhost CheckFloat]$

 

式(1)を「sum(10000:10000) = 」および「sum(20000:20000) =」の値として確認できる。

上のプログラムのファイルcheckFloat.cppは、ファイル名checkFloat.cppをマウスの右ボタンでクリックすることによりダウンロードする事が出来る。

 

Up