数値計算の誤差とは(全体像)
数値計算の誤差は、コンピュータが数を有限の桁数でしか持てないために生じる、本当の値とのズレのこと。
たとえば`0.1`という何でもない数も、コンピュータの中身(2進数)ではぴったり表せず、ほんの少しズレた値で記録される。このズレが積み重なると、計算結果がじわじわと本来の値からはずれていく。
大事なのは、誤差はバグではなく、しくみ上どうしても出るものだということ。だから「どんな種類の誤差があるか」「どう抑えるか」を知っておくことが、正しい計算につながる。試験では、この5種類の誤差を見分けることが問われる。
詳しく:この5種類だけ覚えれば戦える
ここが記事の心臓部。誤差は次の5つに整理できる。
誤差5種類
| 誤差 | どんなとき起きるか |
|---|---|
| 丸め誤差 | 表せない数を決まった桁で丸めるとき(0.1など。不可避) |
| 桁落ち | 近い値どうしの引き算で、有効な桁が激減するとき |
| 情報落ち | 大きい値と小さい値の足し算で、小さい値が消えるとき |
| 打切り誤差 | 無限に続く計算を途中で打ち切って近似したとき |
| 桁あふれ | 表せる範囲を超えたとき(大きすぎ/小さすぎ) |
このうちひっかけの定番が、桁落ちと情報落ち。具体例で見ると違いがはっきりする。
桁落ち vs 情報落ち
| 桁落ち | 情報落ち | |
|---|---|---|
| 計算 | 引き算(−) | 足し算(+) |
| 例 | 1.0001 − 1.0000 = 0.0001 | 10²⁰ + 10⁻¹⁰ ≒ 10²⁰ |
| 何が起きる | 有効な桁が5桁→1桁に激減 | 小さいほうの値が消える |
つまり、桁落ちは「近い値の引き算」で有効桁が減る、情報落ちは「大小差の足し算」で小さい値が消える。残りの3つは、丸め誤差=丸めで不可避、打切り誤差=途中で計算をやめた、桁あふれ=範囲オーバー、と押さえればいい。
なお、誤差を抑えるには計算の順番を工夫する(小さい値から先に足すなど)ことが効く。単に桁数の多い高精度な計算にするだけでは解決しないこともあり、アルゴリズムの組み方が大事になる。
わかりやすく言い換えると
要するに、誤差は「ものさしの目盛りが足りない」ようなもの。細かい目盛りがないものさしでは、どうしても端数が読み取れずズレる。
①丸め誤差 … 目盛りに合わせて四捨五入したズレ
②桁落ち … ほぼ同じ長さを引き算したら、差のところしか残らず精度ガタ落ち
③情報落ち … 巨大な数に米粒みたいな数を足しても、米粒は埋もれて見えなくなる
④打切り誤差 … 永遠に続く割り算を途中でやめたズレ
⑤桁あふれ … ものさしからはみ出した
試験のツボ
🔴 一番出る:桁落ちと情報落ちの見分け
①桁落ち=近い値どうしの引き算で有効桁が激減
②情報落ち=大小差のある足し算で小さい値が消える
🔴 次に出る:5種類の名前と特徴
①丸め誤差=丸めで不可避/打切り誤差=途中で計算を打ち切り
②桁あふれ=表せる範囲を超える
🟡 押さえると安定:誤差を抑える工夫
①計算順序の工夫(小さい値から足す)
②高精度にするだけでなくアルゴリズム設計が大事
よくある間違い
①「桁落ちと情報落ちは同じ現象」→ ✗ 桁落ちは引き算で有効桁が減る、情報落ちは足し算で小さい値が消える。原因が逆。
②「桁数の多い高精度演算にすれば誤差は完全になくせる」→ ✗ 軽減はできても完全には消えない。計算の順番やアルゴリズムの工夫も大事。
③「丸め誤差はプログラムのバグなので直せる」→ ✗ 有限桁で表すかぎり避けられない、しくみ上の誤差。バグではない。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(桁落ち)
ほぼ等しい1.0001と1.0000を引くように、近い値どうしの引き算で生じる誤差として、正しいものはどれか。
- 大きな値に小さな値を足したときに、小さい値が消えてしまう情報落ちである
- ほぼ等しい値の引き算で有効な桁数が大きく減ってしまう、桁落ちと呼ぶ誤差だ
- 表せる範囲を超えてしまったときに起きる、桁あふれ(オーバーフロー)である
- 無限に続く計算を途中で打ち切って近似したために生じる、打切り誤差である
解答は 2 だぜ。
近い値どうしの引き算で有効桁が激減するのが桁落ち。1.0001−1.0000=0.0001で、5桁あった有効桁が1桁に減ってしまうんだ。
選択肢1は足し算で起きる情報落ち。選択肢3は範囲オーバーの桁あふれ。選択肢4は計算を途中でやめた打切り誤差で、どれも別の誤差だぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 情報落ちは足し算で起きる |
| 2 | ✓ | 近い値の引き算で有効桁が減る桁落ち |
| 3 | ✗ | 桁あふれは範囲オーバー |
| 4 | ✗ | 打切り誤差は計算の途中打ち切り |
オリジナル問題2(情報落ち)
10²⁰ + 10⁻¹⁰ を計算するとほぼ 10²⁰ になってしまう現象として、正しいものはどれか。
- 近い値どうしを引いたために有効な桁数が激減した、桁落ちと呼ばれる誤差だ
- 表せる最小の範囲を下回ったために起きる、アンダーフローと呼ばれる現象である
- 数を決まった桁で丸めたために生じる、避けられない丸め誤差と呼ぶものである
- 大小の差が大きい値の足し算で、小さいほうの値が消えてしまう情報落ちである
解答は 4 だぜ。
大きい値と小さい値の足し算で、小さいほうが埋もれて消えるのが情報落ち。10²⁰に10⁻¹⁰を足しても、桁が違いすぎて10²⁰のままなんだ。
選択肢1は引き算で起きる桁落ち。選択肢2のアンダーフローは範囲を下回る話。選択肢3の丸め誤差は丸めによるズレで、いずれも別物だぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 桁落ちは引き算で起きる |
| 2 | ✗ | アンダーフローは範囲を下回る現象 |
| 3 | ✗ | 丸め誤差は丸めによるズレ |
| 4 | ✓ | 大小の足し算で小さい値が消える情報落ち |
オリジナル問題3(誤差全般)
数値計算の誤差に関する次の記述のうち、正しいものはどれか。
- 誤差は有限桁で数を表すかぎり避けられず、計算順序の工夫などで軽減を図っていく
- 丸め誤差はプログラムの書き方が悪いために起きるので、必ず取り除くことができる
- 桁数を多くした高精度演算にすれば、どんな誤差も完全にゼロにすることができる
- 打切り誤差は表せる範囲を超えたときに生じる、桁あふれと同じ意味の誤差である
解答は 1 だぜ。
誤差は有限桁で数を表すかぎり避けられないしくみ上のもの。だから完全にゼロにはできず、計算順序の工夫などで軽減していくのが現実的な対策だ。
選択肢2は丸め誤差を「バグで取り除ける」とする誤り。選択肢3は「完全にゼロ」が誤りで、軽減はできても消せない。選択肢4は打切り誤差を桁あふれと同じとしているが、別物だぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 避けられず、工夫で軽減するのが正しい |
| 2 | ✗ | 丸め誤差はしくみ上のもので消せない |
| 3 | ✗ | 完全にゼロにはできない |
| 4 | ✗ | 打切り誤差と桁あふれは別物 |
まとめ
押さえどころ
- 🔴 桁落ち vs 情報落ち = 引き算なら桁落ち(有効桁が激減)、足し算なら情報落ち(小さい値が消える)。
- 🔴 5種類 = 丸め誤差・桁落ち・情報落ち・打切り誤差・桁あふれ。
- 🟡 対策 = 計算順序の工夫など。高精度にするだけでなくアルゴリズム設計が大事。
次に学ぶ
- 浮動小数点数(IEEE 754) ── 誤差が生まれる土台になる「小数の表し方」。なぜ0.1がぴったり表せないのか、ここを見ると腑に落ちる。
- 基数変換 ── 10進数を2進数へ直す計算。誤差の話とあわせて「コンピュータの数の世界」が立体的になる。
執筆: SikakuQuest編集部