浮動小数点数と誤差をやさしく図解 — 固定小数点との違い・丸め誤差・桁落ち
「なぜ 0.1 + 0.2 が 0.3 にならないの?」——これは浮動小数点数の宿命です。この記事では、コンピュータが小数をどう表しているか(符号・指数部・仮数部)、固定小数点との違い、そして丸め誤差・桁落ち・情報落ちといった誤差の正体を図解します。2進数の基礎は 2進数と基数変換 もどうぞ。
小数点の表し方は2種類 — 固定 と 浮動
コンピュータで小数を表すには、大きく2つの方式があります。
| 固定小数点数 | 浮動小数点数 | |
|---|---|---|
| 小数点の位置 | 固定(決まった桁) | 可変(指数部で動かす) |
| 表せる範囲 | 狭い | 非常に広い(極大〜極小) |
| 処理 | 単純・高速 | やや複雑 |
| 用途 | 範囲が限られる金額計算など | 科学技術計算など広範囲 |
「幅広い大きさの数を、限られたビットで扱いたい」という要求に応えるのが浮動小数点数です。
浮動小数点数のしくみ — 符号・指数部・仮数部
浮動小数点数は、数を3つの部品に分けて表します。10進で言えば 1.5 × 10³ のように、有効数字(仮数)と小数点の位置(指数)を別々に持つ考え方です。
| 部品 | 役割 |
|---|---|
| 符号部 | 正か負か(1ビット) |
| 指数部 | 小数点をどこに動かすか(=数の大きさ・桁) |
| 仮数部 | 有効数字そのもの(=数の精度) |
指数部を増やせば表せる範囲が広がり、仮数部を増やせば精度が上がります。単精度(32ビット)より倍精度(64ビット)の方が、仮数部が長いぶん精度が高くなります。
なぜ 0.1 は正確に表せないのか
ここが誤差の根っこです。0.1 は10進では割り切れますが、2進数にすると無限に続く循環小数になります(0.000110011001100…)。有限のビット数で表すにはどこかで打ち切る(丸める)しかなく、そのぶんわずかにズレます。これが丸め誤差です。だから 0.1 + 0.2 が 0.30000000000000004 のようになります——バグではなく、2進数で小数を表す以上避けられない性質です。
誤差の種類 — 試験頻出
| 誤差 | いつ起きる |
|---|---|
| 丸め誤差 | 表せる桁数を超えた部分を四捨五入・切り捨てするとき(0.1が表せない等) |
| 桁落ち | 非常に近い値どうしを引き算したとき。有効数字が激減する |
| 情報落ち | 絶対値が大きく違う数を足し引きしたとき。小さい数が無視される |
| 打切り誤差 | 本来は無限に続く計算を、途中で打ち切ったとき |
| オーバーフロー | 表せる最大値を超えたとき(アンダーフローは0に近すぎて表せないとき) |
🔢 2進数での表し方を確かめるなら:基数変換ツールで整数の2進数・16進数表現を確認できます。「0.1が2進で割り切れない」感覚は、2進数と基数変換の記事で重み(1/2, 1/4, 1/8…)の足し算として捉えると腹落ちします。
誤差を減らす工夫
浮動小数点の誤差は完全にはなくせませんが、計算の順序や式を工夫して軽減できます。たとえば、絶対値の近い小さな数から先に足す(情報落ち対策)、近い値の引き算を避けるよう式変形する(桁落ち対策)などです。お金の計算のように誤差が許されない場面では、浮動小数点を使わず整数(最小単位=銭・セント)で扱うのが定石です。
基本情報技術者試験ではこう出る
「浮動小数点数の構成(符号部・指数部・仮数部)」「固定小数点と浮動小数点の違い」「桁落ち・情報落ち・丸め誤差はどんなときに起きるか」が定番です。押さえるべきは、指数部=範囲、仮数部=精度 という役割分担と、桁落ち=近い値の引き算/情報落ち=大小差の足し算 という原因の区別。「0.1が正確に表せない=丸め誤差」という代表例も頻出です。
よくある質問
Q. 単精度と倍精度の違いは?
A. ビット数の違いです。単精度は32ビット、倍精度は64ビット。倍精度は仮数部が長いぶん精度が高く、指数部も広いぶん表せる範囲も広がります。多くのプログラミング言語の double は倍精度です。
Q. お金の計算で浮動小数点を使ってはいけないの?
A. 誤差が許されない金額計算では避けるのが基本です。丸め誤差で1円ずれる可能性があるため、整数(円や銭などの最小単位)で扱うか、誤差の出ない10進の型(decimal型など)を使います。
Q. なぜ2進数だと0.1が割り切れないの?
A. 2進数の小数は 1/2, 1/4, 1/8… の足し算でしか表せず、これらをどう組み合わせても0.1(=1/10)ちょうどにはできないからです。10進で1/3が0.333…と割り切れないのと同じ理屈です。
まとめ
浮動小数点数は、符号・指数部(範囲)・仮数部(精度)で数を表し、広い範囲を少ないビットで扱えます。ただし2進数で小数を表す都合上、丸め誤差は避けられません。桁落ち(近い値の引き算)・情報落ち(大小差の足し算)の原因を押さえ、誤差が困る場面では整数で扱う——これが実務と試験の要点です。