次は,
を計算します. この和を大きい方からと, 小さい方から
の 2通りで計算してみます. 丸め誤差の積み重ねを実感して頂くためで,
『塵も積もれば山となる』の実例です.
プログラムの先頭の方にある #define TERMNUM 10000 は,
cpp (C preprocessor) に対する指示で, プログラムソースの中にある
TERMNUM という文字列を 10000 に置き換えるという意味になります.
また, sign/((double) i) という部分がありますが, これは異なる
型の変数の割算をする際に, int 型 i を double 型に変換して割算を
実行させるためです. C 言語の仕様の上では, 異なる型の計算は自動的に
範囲の大きい方に合わせて実行されますが, 敢えて明示的に型変換を
記述しました. このような型変換を変数のキャスト(cast)といいます.
/* File name 5-4.c */
#include <stdio.h>
#define TERMNUM 10000
main()
{
int i;
double sign=1.0;
double sum1=0.0;
double sum2=0.0;
for(i=1; i <= TERMNUM; i++){
sum1= sum1+sign/((double) i);
sign*=-1.0;
}
sign=-1.0;
for(i=TERMNUM; i >= 1; i--){
sum2= sum2+sign/((double) i);
sign*=-1.0;
}
printf("sum1 = %18.17f, sum2 = %18.17f\n",sum1, sum2);
}
プログラムを実行してみるとわかりますが. 計算方法 によって答が違います. ちなみに和の正確な値は, 0.693097183059945296917232371458 で, 小さい方からの和の方が, 3桁程精度が良くなります.
良く知られているように,
の領域で,
が成立します. この級数は
でも収束し
が成立します.(練習問題 1)
ですから, 上の和の収束はとても遅く, これを使って
を計算するのは
得策ではありません.