平成18年度 技術士第一次試験問題【専門科目】
【16】情報工学部門
W−3
1/1 + 1/2 + 1/3 + ・・・ + 1/99999 + 1/100000 を計算するために、
C言語で次の二つの関数 A, B を作った。ただし float は IEEE754 に
従う単精度 (32bit) の型であり、コンパイルされた機械語コードは、
ソースコード中に記述された演算をすべて順序どおりに実行するものとする。

float A() {
 int i; float sum = 0.0;
 for (i=1; i <= 100000; i++) {
  sum += 1.0/(float)i;
 }
 return sum;
}
float B() {
 int i; float sum = 0.0;
 for (i=100000; i>=1; i--) {
  sum += 1.0/(float)i;
 }
 return sum;
}
A,B の実行結果について、@〜Dの中から最も適切なものを選べ。

 @ A と B の結果は同じ精度になる。
 A A の結果の方が B より精度が高い。
 B B の結果の方が A より精度が高い。
 C A はオーバフローになるが、B は正常に実行できる。
 D B はオーバフローになるが、A は正常に実行できる。



【正解】 B

A は
B は 1/100000 + 1/99999 + 1/99998 + ・・・ と、小さい数字から足していく。

絶対値が大きい数と小さい数を足したり引いたりする場合に、その差が極端すぎて
小さい方の値が無視されてしまう現象を
情報落ちという。
Aのプログラムでは
 1/1 + 1/2 + 1/3 + ・・・ と、大きい数字から足していくため
0.00001のような絶対値の小さい値を足しこんでも情報落ちして、
精度が低くなる。


【類題】
H24 W-7


EXCELのマクロのご相談なら ファーストマクロ 



W−2 目次 W−4
ファーストマクロ TOPページ