プログラミングの基礎(擬似言語のトレース)

実数型の値は IEEE 754 の倍精度(binary64)で表し、加算の結果は最も近い表せる値に丸める。次のプログラムを実行した後の c の値はどれか。

実数型: x ← 0.0
整数型: c ← 0
while (x < 1.0)
  x ← x + 0.1
  c ← c + 1
endwhile
  1. A9
  2. B10
  3. 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回実行されます。
この分野を解く 分野ページへ

関連する計算ツール

プログラミングの基礎(擬似言語のトレース)の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

プログラミングの基礎(擬似言語のトレース)のほかの問題

  1. クラス Counter は、インスタンスごとに整数型のメンバ変数 count(生成時は0)を持ち、メソッド inc() は自分の count に1を加える。次のプログラムを実行した後の x の値はどれか。
  2. クラス Counter は、インスタンスごとに整数型のメンバ変数 count(生成時は0)を持ち、メソッド inc() は自分の count に1を加える。Counter 型の変数には、インスタンスそのものではなく、インスタンスへの参照が入る。次のプログラムを実行した後の x の値はどれか。
  3. 次のプログラムで、x と y の値を入れ替えるつもりで2つの代入文を書いた。実行した後の x と y の値の組はどれか。
  4. 3つの変数の値を順に送る次のプログラムを実行した後の a、b、c の値の組はどれか。
  5. x を3倍することを繰り返す次のプログラムを実行した後の n の値はどれか。