浮動小数点数と誤差をやさしく図解 — 固定小数点との違い・丸め誤差・桁落ち

公開: 2026年7月 カテゴリ: 基礎理論

「なぜ 0.1 + 0.20.3 にならないの?」——これは浮動小数点数の宿命です。この記事では、コンピュータが小数をどう表しているか(符号・指数部・仮数部)、固定小数点との違い、そして丸め誤差・桁落ち・情報落ちといった誤差の正体を図解します。2進数の基礎は 2進数と基数変換 もどうぞ。

小数点の表し方は2種類 — 固定 と 浮動

コンピュータで小数を表すには、大きく2つの方式があります。

固定小数点数浮動小数点数
小数点の位置固定(決まった桁)可変(指数部で動かす)
表せる範囲狭い非常に広い(極大〜極小)
処理単純・高速やや複雑
用途範囲が限られる金額計算など科学技術計算など広範囲

「幅広い大きさの数を、限られたビットで扱いたい」という要求に応えるのが浮動小数点数です。

浮動小数点数のしくみ — 符号・指数部・仮数部

浮動小数点数は、数を3つの部品に分けて表します。10進で言えば 1.5 × 10³ のように、有効数字(仮数)小数点の位置(指数)を別々に持つ考え方です。

部品役割
符号部正か負か(1ビット)
指数部小数点をどこに動かすか(=数の大きさ・桁)
仮数部有効数字そのもの(=数の精度)
浮動小数点数の内部(32ビットの例) 符号 1ビット 指数部 8ビット(大きさ・桁) 仮数部 23ビット(有効数字・精度) 値 = (−1)符号 × 1.仮数 × 2指数 という形で表す
図1: 指数部が「桁(大きさ)」、仮数部が「有効数字(精度)」を担当。IEEE 754という国際規格が有名

指数部を増やせば表せる範囲が広がり、仮数部を増やせば精度が上がります。単精度(32ビット)より倍精度(64ビット)の方が、仮数部が長いぶん精度が高くなります。

なぜ 0.1 は正確に表せないのか

ここが誤差の根っこです。0.1 は10進では割り切れますが、2進数にすると無限に続く循環小数になります(0.000110011001100…)。有限のビット数で表すにはどこかで打ち切る(丸める)しかなく、そのぶんわずかにズレます。これが丸め誤差です。だから 0.1 + 0.20.30000000000000004 のようになります——バグではなく、2進数で小数を表す以上避けられない性質です。

誤差の種類 — 試験頻出

誤差いつ起きる
丸め誤差表せる桁数を超えた部分を四捨五入・切り捨てするとき(0.1が表せない等)
桁落ち非常に近い値どうしを引き算したとき。有効数字が激減する
情報落ち絶対値が大きく違う数を足し引きしたとき。小さい数が無視される
打切り誤差本来は無限に続く計算を、途中で打ち切ったとき
オーバーフロー表せる最大値を超えたとき(アンダーフローは0に近すぎて表せないとき)
桁落ち(近い値の引き算) 1.2346 −1.2345 0.0001 有効数字が5桁→1桁に激減 情報落ち(大小差の足し算) 1000000 + 0.0001 1000000 小さい0.0001が消えてしまう
図2: 桁落ちは「近い値の引き算」で有効数字が減る、情報落ちは「大小差の足し算」で小さい数が消える

🔢 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進数で小数を表す都合上、丸め誤差は避けられません桁落ち(近い値の引き算)・情報落ち(大小差の足し算)の原因を押さえ、誤差が困る場面では整数で扱う——これが実務と試験の要点です。

関連ページ: 2進数と基数変換基数変換ツール計算量とO記法記事一覧