有効桁数による和の精度のチェック例
コンピュータ上で表されている数値の有効桁数のため、同じものを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をマウスの右ボタンでクリックすることによりダウンロードする事が出来る。