かずま さんが書きました:
解決したのなら、なぜ 100回繰り返すのかを説明してください。
forループの中に、printf("%3d: %.16f\n", i, j); を入れて、
どうなるか見てください。
わからなければ、質問してください。ループの終了条件に付いて、私が詳しく説明します。
もう解決したと思っているのか、質問者からは返事がありませんが、説明します。
コード:
#include <stdio.h>
int main(void)
{
double s = 0; // 項の和(級数)
double a = 1; // 項
for (int i = 0; i < 100; i++) {
s += a; // 和を更新
a *= -1.0/2.0; // 項の更新
printf("%3d: s =%30.26f a =%30.26f\n", i, s, a);
}
printf("和は%fです。", s);
return 0;
}
実行結果
コード:
0: s = 1.00000000000000000000000000 a = -0.50000000000000000000000000
1: s = 0.50000000000000000000000000 a = 0.25000000000000000000000000
2: s = 0.75000000000000000000000000 a = -0.12500000000000000000000000
3: s = 0.62500000000000000000000000 a = 0.06250000000000000000000000
4: s = 0.68750000000000000000000000 a = -0.03125000000000000000000000
5: s = 0.65625000000000000000000000 a = 0.01562500000000000000000000
6: s = 0.67187500000000000000000000 a = -0.00781250000000000000000000
7: s = 0.66406250000000000000000000 a = 0.00390625000000000000000000
8: s = 0.66796875000000000000000000 a = -0.00195312500000000000000000
...
19: s = 0.66666603088378906250000000 a = 0.00000095367431640625000000
20: s = 0.66666698455810546875000000 a = -0.00000047683715820312500000
21: s = 0.66666650772094726562500000 a = 0.00000023841857910156250000
22: s = 0.66666674613952636718750000 a = -0.00000011920928955078125000
23: s = 0.66666662693023681640625000 a = 0.00000005960464477539062500
24: s = 0.66666668653488159179687500 a = -0.00000002980232238769531250
25: s = 0.66666665673255920410156250 a = 0.00000001490116119384765625
...
51: s = 0.66666666666666651863693005 a = 0.00000000000000022204460493
52: s = 0.66666666666666674068153498 a = -0.00000000000000011102230246
53: s = 0.66666666666666662965923251 a = 0.00000000000000005551115123
54: s = 0.66666666666666674068153498 a = -0.00000000000000002775557562
55: s = 0.66666666666666674068153498 a = 0.00000000000000001387778781
56: s = 0.66666666666666674068153498 a = -0.00000000000000000693889390
...
97: s = 0.66666666666666674068153498 a = 0.00000000000000000000000000
98: s = 0.66666666666666674068153498 a = -0.00000000000000000000000000
99: s = 0.66666666666666674068153498 a = 0.00000000000000000000000000
和は0.666667です。
double の精度は 2進で 53ビット、10進で約16桁です。
これにより、54: からあとは、s の値が変化していません。
a の値が小さくなりすぎたからです。
%f は、小数点以下 6桁で表示します。
それでよいのなら、a の絶対値が 1.0e-7 以下になった時に
ループを終了すればよいことが分かります。
#include <math.h> を追加し、
for (int i = 0; fabs(a) >= 1.0e-7; i++) {
とすれはよいでしょう。