1/1 + 1/2 + 1/3 + ・・・ + 1/9999999 + 1/10000000 を計算するために、C言語で次の2つの関数 A、Bを作った。ただし
double はIEEE754に従う倍精度 (64bit) の型であり、コンパイルされた機械語コードは、ソースコード中に記述された演算をすべて順序どおりに実行するものとする。
double A () {
int i; double sum = 0.0;
for (i = 1; i <= 10000000; i++) {
sum += 1.0/(double) i;
}
return sum;
}
double B () {
int i; double sum = 0.0;
for (i = 10000000; i > = 1; i--) {
sum += 1.0/ (double) i;
}
return sum;
}
A、Bの実行結果について、最も適切なものはどれか。
@ AとBの結果は同じ精度になる。
A Aの結果の方がBより精度が高い。
B Bの結果の方がAより精度が高い。
C Aはオーバーフローになるが、Bは正常に実行できる。
D Bはオーバーフローになるが、Aは正常に実行できる。
B
絶対値が大きい数と小さい数を足したり引いたりする場合に、その差が極端すぎて小さい方の値が無視されてしまう現象を情報落ちという。
Aのプログラムでは、1/1 + 1/2 + 1/3 + ・・・ と、大きい数字から足していくため、足しこんだ値に、さらに0.00001のような絶対値の小さい値を足しこんでも情報落ちして、精度が低くなる。
W−6 | 目次 | W−8 |