プログラミングの基礎(擬似言語のトレース)
実数型の値は IEEE 754 の倍精度(binary64)で表し、加算の結果は最も近い表せる値に丸める。次のプログラムを実行した後の c の値はどれか。
実数型: x ← 0.0
整数型: c ← 0
while (x < 1.0)
x ← x + 0.1
c ← c + 1
endwhile
- A9
- B10
- C11
答えと解説を見る
正解:C. 11
0.1 は2進数では循環小数になり、倍精度では0.1よりわずかに大きい近似値で表されます。これを足していくと加算のたびに丸め誤差が生じ、10回足した結果は1.0ではなく0.9999999999999999になります。この値は x < 1.0 を満たすので11回目の加算が行われ、x が約1.1になって繰返しを抜けるため、c = 11 です。実数の繰返しの回数は整数の変数で数え、実数どうしを = や ≠ で比べるのは避けます。条件を x ≠ 1.0 にすると、x がちょうど1.0にならないので繰返しが終わりません。
- A. 0.1を9回足した値は約0.9で、まだ1.0未満です。
- B. 誤差がなければ10回で x = 1.0 になりますが、実際には10回目の結果が1.0をわずかに下回ります。
- C. 正しい。10回足した結果が0.9999999999999999で1.0未満のため、11回実行されます。