浮動小数点数の誤差とは?丸め誤差・桁落ち・情報落ちを図解で解説
応用情報技術者試験の基礎理論分野では、浮動小数点数の誤差として「丸め誤差」「桁落ち」「情報落ち」の3つが定番で問われます。名前が似ていて混同しやすい分野ですが、それぞれ発生するメカニズムが異なるため、仕組みから区別できるようにしておきましょう。
浮動小数点数とは何か
浮動小数点数は、実数をコンピュータ上で「符号部・指数部・仮数部」に分けて表現する方式です。IEEE 754という標準規格に基づき、多くのプログラミング言語の double 型や float 型で採用されています。
値 = (-1)^符号 × 1.仮数部 × 2^指数部
この形式は非常に広い範囲の数値を表現できる一方、仮数部のビット数が有限であるため、すべての実数を正確に表現できるわけではないという制約を抱えています。この制約から生じるのが、これから解説する3種類の誤差です。
固定小数点数との違いや、そもそもなぜ浮動小数点数が広く使われているかについては、精度と表現範囲のトレードオフを理解する上で前提になる知識なので、まずはこの制約を押さえておくことが重要です。
丸め誤差:2進数で表現しきれないことによる誤差
丸め誤差(Round-off Error)は、実数を2進数の浮動小数点数として表現する際、仮数部の桁数に収まりきらない部分を四捨五入・切り捨てなどで丸めることによって生じる誤差です。
代表的な例が 0.1 です。10進数では単純な小数に見えますが、2進数では次のように無限小数になります。
0.1(10進) = 0.0001100110011...(2進、循環小数)
有限のビット数しか持たない仮数部では、この無限に続く2進数を途中で打ち切らざるを得ません。そのため 0.1 をコンピュータ上でそのまま保持することはできず、わずかな誤差を含んだ近似値として扱われます。プログラミングで 0.1 + 0.2 == 0.3 が false になるという有名な現象は、この丸め誤差が原因です。
丸め誤差は「値を表現しようとした時点」で必ず発生しうる、最も基本的な誤差だと理解しておくとよいでしょう。
桁落ち:近い値同士の減算で有効桁数が失われる誤差
桁落ち(Cancellation)は、絶対値がほぼ等しい2つの数値同士を減算した際、上位の桁が互いに打ち消し合うことで有効桁数が大きく失われる誤差です。
例えば、有効数字4桁で次のような減算を考えます。
1.235 × 10^3 − 1.234 × 10^3 = 0.001 × 10^3 = 1.000 × 10^0
一見正しい計算に見えますが、元の2つの値がそれぞれ4桁の精度を持っていたのに対し、結果は実質的に1桁分の情報しか持たなくなっています。上位3桁が互いに打ち消し合うことで、丸め誤差によって生じていたわずかなブレが、結果全体に対して相対的に大きな影響を及ぼすようになるのです。
桁落ちは「似た値同士を引き算すると危険」という直感的な理解がそのまま試験対策になります。数値計算のアルゴリズムでは、桁落ちが起きにくいよう式を変形する(例: 二次方程式の解の公式で桁落ちを避ける工夫)ことが定番のテクニックとして知られています。
情報落ち:絶対値の差が大きい値同士の演算で小さい方が無視される誤差
情報落ち(Loss of Trailing Digits)は、絶対値の差が非常に大きい2つの数値同士を加算・減算した際、仮数部の桁数の制約により小さい方の値の情報が結果にほとんど反映されなくなる誤差です。
例えば、有効数字4桁で次のような加算を考えます。
1.000 × 10^8 + 1.000 × 10^0
指数部を揃えて仮数部同士を足そうとすると、10^0 の値は 10^8 に対して桁が離れすぎており、有効数字4桁の枠に収まりきりません。結果として、小さい方の値がまるごと計算結果に反映されない、ということが起こります。
桁落ちが「近い値の減算」で起きるのに対し、情報落ちは「桁の離れた値の加減算」で起きる、という発生条件の違いが試験でよく対比されます。ループ処理で小さな値を大きな値に順番に加算していく(合計値がどんどん大きくなる)場合、途中から情報落ちが発生し、加算しているはずの小さい値が結果に反映されなくなることがあるので注意が必要です。
3種類の誤差の比較
| 誤差の種類 | 発生条件 | 原因 |
|---|---|---|
| 丸め誤差 | 実数を2進数で表現する時点で常に発生しうる | 仮数部の桁数に収まらない部分を丸める |
| 桁落ち | 絶対値がほぼ等しい値同士の減算 | 上位桁が打ち消し合い有効桁数が失われる |
| 情報落ち | 絶対値の差が非常に大きい値同士の加減算 | 小さい方の値が仮数部の桁数からあふれて無視される |
試験では「桁落ちと情報落ちの発生条件を入れ替えた誤った説明文」がよく出題されます。「近い値の引き算=桁落ち」「離れた値の足し算=情報落ち」という対比のペアで覚えておくと、選択肢の入れ替えに惑わされにくくなります。
実務での注意点
浮動小数点数の誤差は試験だけの話ではなく、実務のプログラミングやデータ処理でも直接影響します。
- 金額計算でのfloat/double使用は避ける: 金融系のシステムで金額をfloatやdoubleで扱うと、丸め誤差の蓄積によって数円単位のズレが生じることがあります。金額計算には10進数を正確に扱える固定小数点型(例: Pythonの
Decimal、JavaのBigDecimal)を使うのが定石です - 浮動小数点数の等価比較を避ける:
if (a == b)のような浮動小数点数同士の完全一致比較は、丸め誤差の影響でほぼ確実に意図通り動きません。許容誤差(イプシロン)を設けた比較(abs(a - b) < 1e-9など)を使うのが一般的です - 集計処理での情報落ちに注意: SparkやPandasで大量の小さい値を単純にsumで積み上げていくと、合計値が大きくなるにつれて情報落ちに近い現象で精度が低下することがあります。統計的な集計では、桁落ち・情報落ちを避けるアルゴリズム(Kahanの加算アルゴリズムなど)が使われることもあります
自分も過去に、大量データの集計バッチで浮動小数点の丸め誤差が蓄積し、期待値とわずかにズレる不具合に遭遇したことがあります。原因調査の際、まさにこの「丸め誤差・桁落ち・情報落ち」の切り分けの知識が役立ちました。
試験対策のポイント
応用情報技術者試験で浮動小数点数の誤差が問われる際は、以下の観点が狙われやすいです。
- 浮動小数点数が仮数部の桁数によって精度に限界を持つという前提
- 丸め誤差が「表現しようとした時点」で常に発生しうるという性質
- 桁落ちの発生条件(近い値同士の減算)と、有効桁数が失われるメカニズム
- 情報落ちの発生条件(絶対値の差が大きい値同士の加減算)と、小さい方が無視されるメカニズム
- 桁落ち・情報落ちを軽減するための計算式の工夫(式変形、加算順序の調整)
「どの演算で」「どんな値の組み合わせのときに」発生するかをセットで覚えておくと、計算問題・語句問題どちらの出題形式にも対応しやすくなります。
まとめ
浮動小数点数の誤差は、仮数部の桁数が有限であることに起因し、丸め誤差(表現時点で常に発生)・桁落ち(近い値同士の減算で有効桁数が失われる)・情報落ち(桁の離れた値同士の加減算で小さい方が無視される)の3種類に整理できます。それぞれの発生条件を区別して理解しておくことは、試験対策はもちろん、金額計算や大規模データの集計処理で誤差を防ぐ実務的な判断にも直結します。