数値計算の誤差とは?コンピュータは決まった桁数しか扱えないため

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

数値計算の誤差とは(全体像)

数値計算の誤差は、コンピュータが数を有限の桁数でしか持てないために生じる、本当の値とのズレのこと。

たとえば`0.1`という何でもない数も、コンピュータの中身(2進数)ではぴったり表せず、ほんの少しズレた値で記録される。このズレが積み重なると、計算結果がじわじわと本来の値からはずれていく。

大事なのは、誤差はバグではなく、しくみ上どうしても出るものだということ。だから「どんな種類の誤差があるか」「どう抑えるか」を知っておくことが、正しい計算につながる。試験では、この5種類の誤差を見分けることが問われる。


詳しく:この5種類だけ覚えれば戦える

ここが記事の心臓部。誤差は次の5つに整理できる。

誤差5種類

誤差どんなとき起きるか
丸め誤差表せない数を決まった桁で丸めるとき(0.1など。不可避)
桁落ち近い値どうしの引き算で、有効な桁が激減するとき
情報落ち大きい値と小さい値の足し算で、小さい値が消えるとき
打切り誤差無限に続く計算を途中で打ち切って近似したとき
桁あふれ表せる範囲を超えたとき(大きすぎ/小さすぎ)

このうちひっかけの定番が、桁落ちと情報落ち。具体例で見ると違いがはっきりする。

桁落ち vs 情報落ち

桁落ち情報落ち
計算引き算(−)足し算(+)
1.0001 − 1.0000 = 0.000110²⁰ + 10⁻¹⁰ ≒ 10²⁰
何が起きる有効な桁が5桁→1桁に激減小さいほうの値が消える

つまり、桁落ちは「近い値の引き算」で有効桁が減る情報落ちは「大小差の足し算」で小さい値が消える。残りの3つは、丸め誤差=丸めで不可避、打切り誤差=途中で計算をやめた、桁あふれ=範囲オーバー、と押さえればいい。

なお、誤差を抑えるには計算の順番を工夫する(小さい値から先に足すなど)ことが効く。単に桁数の多い高精度な計算にするだけでは解決しないこともあり、アルゴリズムの組み方が大事になる。

わかりやすく言い換えると

要するに、誤差は「ものさしの目盛りが足りない」ようなもの。細かい目盛りがないものさしでは、どうしても端数が読み取れずズレる。

丸め誤差 … 目盛りに合わせて四捨五入したズレ

桁落ち … ほぼ同じ長さを引き算したら、差のところしか残らず精度ガタ落ち

情報落ち … 巨大な数に米粒みたいな数を足しても、米粒は埋もれて見えなくなる

打切り誤差 … 永遠に続く割り算を途中でやめたズレ

桁あふれ … ものさしからはみ出した


試験のツボ

🔴 一番出る:桁落ちと情報落ちの見分け

①桁落ち=近い値どうしの引き算で有効桁が激減

②情報落ち=大小差のある足し算で小さい値が消える

🔴 次に出る:5種類の名前と特徴

①丸め誤差=丸めで不可避/打切り誤差=途中で計算を打ち切り

②桁あふれ=表せる範囲を超える

🟡 押さえると安定:誤差を抑える工夫

①計算順序の工夫(小さい値から足す)

②高精度にするだけでなくアルゴリズム設計が大事


よくある間違い

「桁落ちと情報落ちは同じ現象」→ ✗  桁落ちは引き算で有効桁が減る、情報落ちは足し算で小さい値が消える。原因が逆。

「桁数の多い高精度演算にすれば誤差は完全になくせる」→ ✗  軽減はできても完全には消えない。計算の順番やアルゴリズムの工夫も大事。

「丸め誤差はプログラムのバグなので直せる」→ ✗  有限桁で表すかぎり避けられない、しくみ上の誤差。バグではない。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(桁落ち)

📝 オリジナル問題 1 桁落ち

ほぼ等しい1.0001と1.0000を引くように、近い値どうしの引き算で生じる誤差として、正しいものはどれか。

  1. 大きな値に小さな値を足したときに、小さい値が消えてしまう情報落ちである
  2. ほぼ等しい値の引き算で有効な桁数が大きく減ってしまう、桁落ちと呼ぶ誤差だ
  3. 表せる範囲を超えてしまったときに起きる、桁あふれ(オーバーフロー)である
  4. 無限に続く計算を途中で打ち切って近似したために生じる、打切り誤差である
シーピードラ
シーピードラ 解答・解説

解答は 2 だぜ。

近い値どうしの引き算で有効桁が激減するのが桁落ち。1.0001−1.0000=0.0001で、5桁あった有効桁が1桁に減ってしまうんだ。

選択肢1は足し算で起きる情報落ち。選択肢3は範囲オーバーの桁あふれ。選択肢4は計算を途中でやめた打切り誤差で、どれも別の誤差だぜ。

選択肢判定理由
1情報落ちは足し算で起きる
2近い値の引き算で有効桁が減る桁落ち
3桁あふれは範囲オーバー
4打切り誤差は計算の途中打ち切り

オリジナル問題2(情報落ち)

📝 オリジナル問題 2 情報落ち

10²⁰ + 10⁻¹⁰ を計算するとほぼ 10²⁰ になってしまう現象として、正しいものはどれか。

  1. 近い値どうしを引いたために有効な桁数が激減した、桁落ちと呼ばれる誤差だ
  2. 表せる最小の範囲を下回ったために起きる、アンダーフローと呼ばれる現象である
  3. 数を決まった桁で丸めたために生じる、避けられない丸め誤差と呼ぶものである
  4. 大小の差が大きい値の足し算で、小さいほうの値が消えてしまう情報落ちである
シーピードラ
シーピードラ 解答・解説

解答は 4 だぜ。

大きい値と小さい値の足し算で、小さいほうが埋もれて消えるのが情報落ち。10²⁰に10⁻¹⁰を足しても、桁が違いすぎて10²⁰のままなんだ。

選択肢1は引き算で起きる桁落ち。選択肢2のアンダーフローは範囲を下回る話。選択肢3の丸め誤差は丸めによるズレで、いずれも別物だぜ。

選択肢判定理由
1桁落ちは引き算で起きる
2アンダーフローは範囲を下回る現象
3丸め誤差は丸めによるズレ
4大小の足し算で小さい値が消える情報落ち

オリジナル問題3(誤差全般)

📝 オリジナル問題 3 誤差の性質と対策

数値計算の誤差に関する次の記述のうち、正しいものはどれか。

  1. 誤差は有限桁で数を表すかぎり避けられず、計算順序の工夫などで軽減を図っていく
  2. 丸め誤差はプログラムの書き方が悪いために起きるので、必ず取り除くことができる
  3. 桁数を多くした高精度演算にすれば、どんな誤差も完全にゼロにすることができる
  4. 打切り誤差は表せる範囲を超えたときに生じる、桁あふれと同じ意味の誤差である
シーピードラ
シーピードラ 解答・解説

解答は 1 だぜ。

誤差は有限桁で数を表すかぎり避けられないしくみ上のもの。だから完全にゼロにはできず、計算順序の工夫などで軽減していくのが現実的な対策だ。

選択肢2は丸め誤差を「バグで取り除ける」とする誤り。選択肢3は「完全にゼロ」が誤りで、軽減はできても消せない。選択肢4は打切り誤差を桁あふれと同じとしているが、別物だぜ。

選択肢判定理由
1避けられず、工夫で軽減するのが正しい
2丸め誤差はしくみ上のもので消せない
3完全にゼロにはできない
4打切り誤差と桁あふれは別物

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る