IT用語を超やさしく理解する
数値の範囲と演算誤差
別名: 数値誤差 / 演算誤差 / 丸め誤差 / 打切り誤差 / 桁落ち / 情報落ち / オーバーフロー / アンダーフロー
先に知っておくと分かりやすいことば(1語)
必要なら先に確認できます。知っていることばは、そのまま読み進めて大丈夫です。
- 浮動小数点数浮動小数点数の考え方、符号・指数・仮数、2進数の正規化、単精度と倍精度の位置付けを初心者向けに説明します。
30秒で思い出す
コンピュータが数を扱うbit数は有限なので、表せる範囲と細かさには限界があります。
そのため、
- 表せない値を近い値へ直す 丸め誤差
- 桁数を途中で切る 打切り と、その結果として生じる 打切り誤差
- 近い値どうしの減算で有効桁が失われる 桁落ち
- 大きさが極端に違う値の加減算で小さい値の情報が消える 情報落ち
- 最大範囲を超える オーバーフロー
- 非常に小さい値を表しきれなくなる アンダーフロー
などが起こります。
なぜ誤差や範囲の限界がある?
整数でも小数でも、使えるbit数が決まっていれば表せる値の種類は有限です。
固定小数点では、小数点位置とbit数によって範囲と刻み幅が決まります。
浮動小数点では、指数部が主に表現範囲、仮数部が主に精度へ影響します。
どちらも有限bitである以上、数学上のすべての実数をそのまま保存することはできません。
丸め誤差
表したい値が、その形式でちょうど表せないとき、近い値へ置き換えることで差が生じます。
たとえば10進数の0.1は、2進数では有限桁で終わりません。
有限bitの2進浮動小数点では、0.1そのものではなく、0.1に近い値を保存します。
このように、表現可能な近い値へ丸めた結果の差が丸め誤差です。
打切りと打切り誤差
必要な桁数を超えた部分を、そのまま捨てる処理が 打切り です。その打切りによって元の値との差が生じたとき、その差を 打切り誤差 と呼びます。
たとえば、
1.234567...
を小数第3位まで残して、
1.234
とするのが打切りです。
丸めが「決められた規則で近い表現可能値を選ぶ」のに対し、打切りは「それ以降を捨てる」と考えると区別しやすくなります。どちらも有限桁で値を扱うときに誤差の原因になります。
桁落ち
非常に近い値どうしを引くと、先頭側の有効な桁が打ち消し合い、結果に使える有効桁が急に少なくなることがあります。
たとえば、有限桁で近似された値どうしを、
1.23456 - 1.23455
のように引くと、多くの上位桁が消えます。
元の値にわずかな丸め誤差が含まれていると、その誤差の影響が結果で相対的に大きくなります。
これが 桁落ち です。
情報落ち
非常に大きな値と非常に小さな値を加減算すると、小さい値が有効桁の外へ追い出され、結果へ反映されないことがあります。
たとえば、有限桁の浮動小数点で、
とても大きな値 + とても小さな値
を計算したとき、小さい値を足しても結果が変わらない場合があります。
このように、小さい側の情報が計算結果から失われるのが情報落ちです。
桁落ちと情報落ちの違い
| 現象 | 典型的な状況 | 何が失われる? |
|---|---|---|
| 桁落ち | 近い値どうしの減算 | 上位桁が相殺され、有効桁が減る |
| 情報落ち | 大きさが極端に違う値の加減算 | 小さい値の寄与が消える |
「近い数の引き算」なら桁落ち、「大きい数と小さい数の足し引き」なら情報落ち、とまず整理すると覚えやすくなります。
オーバーフロー
計算結果が、その形式で表せる最大値や最小値の範囲を超えることをオーバーフローといいます。
たとえば8bitの2の補数で表せる整数は -128〜127 です。
120 + 20 = 140
ですが、140は8bitの2の補数では表せません。
このように、正しい数学上の結果が表現可能範囲を超えるとオーバーフローになります。
アンダーフロー
浮動小数点などで、0ではない非常に小さな値が、その形式で通常扱える小ささの限界を下回ることをアンダーフローといいます。
値が小さすぎると、精度が低下したり、形式や処理によっては0として扱われたりします。
オーバーフローが「大きすぎる」問題なら、アンダーフローは「0に近すぎる」問題です。
誤差はバグとは限らない
浮動小数点で、
0.1 + 0.2
が数学上の0.3と完全には一致しないことがあります。
これは多くの場合、2進数で0.1や0.2を有限bitに正確に表せないことから生じる表現上の性質です。
そのため、数値計算では「完全一致を前提にしてよいか」「許容誤差を考えるべきか」を判断する必要があります。
どこで注意する?
金額、計測値、統計値、シミュレーションなど、数値結果を比較・蓄積する処理では、必要な精度と表現形式が合っているかを考える必要があります。
特に浮動小数点値を「完全に同じか」で比較したり、非常に大きい値と小さい値を何度も混ぜて計算したりすると、誤差の影響が見えやすくなります。
重要なのは「浮動小数点は危険」と覚えることではなく、有限bitで表す以上は限界があり、用途に必要な精度を選ぶことです。
よくある勘違い
桁落ちと情報落ちは同じ?
違います。桁落ちは近い値の減算で有効桁が相殺される現象、情報落ちは大きさの違う値の演算で小さい値の寄与が消える現象です。
オーバーフローは浮動小数点だけで起きる?
いいえ。固定bitの整数でも、表現可能範囲を超えれば起こります。
丸め誤差があれば計算結果は必ず役に立たない?
いいえ。必要な精度に対して誤差が十分小さければ利用できます。重要なのは、表現形式と必要精度を理解して扱うことです。
このKnowledgeで扱わないこと
ここでは代表的な誤差・範囲の概念を区別し、基本的な状況へ適用できることを目的にします。
IEEE 754の特殊値、非正規化数、具体的な丸めモード、数値解析の高度な安定性評価までは扱いません。
ここまで分かればOK
- 有限bitでは表現範囲と精度に限界があると説明できる
- 丸めと打切りを区別し、打切りによって打切り誤差が生じることを説明できる
- 桁落ちと情報落ちを典型的な状況から区別できる
- オーバーフローが表現可能範囲を超えた状態だと分かる
- アンダーフローが0に近い非常に小さい値に関する限界だと分かる
- 浮動小数点の誤差を、必ずしも実装バグとは限らない表現上の性質として理解できる
資格との関係
基本情報技術者試験
- シラバス
- Ver.9.2
- 必要な理解
- 問題で応用できる
- 重要度
- 高
- 分野
- テクノロジ
関連するIT用語
理解できたか確認しよう
答えを選んで、なぜそうなるのかまで確認できます。
確認問題 1
大きさの異なる値の加算で起きる誤差
有限桁の浮動小数点で、非常に大きな値に非常に小さな値を加えたところ、小さい値の影響が結果に現れませんでした。
この現象として最も適切なものはどれですか?
確認問題 2
8bit符号付き整数のオーバーフロー
8bitの2の補数で符号付き整数を扱う処理で、120と20を加算します。
この計算について最も適切な説明はどれですか?