【ふどうしょうすうてん】

浮動小数点 とは?

最終更新:
💡 限られた桁で、広い範囲の数を表す

数を符号・仮数・指数などで表し、限られた桁数で広い範囲を扱う方式。二進と十進の方式があり、使う型や精度に応じて丸めが生じる。

📌 このページのポイント
binary32で3.25を表す例 符号 指数 小数部 0 10000000 10100000000000000000000 正規化数:1 ≤ 指数の値 ≤ 254 (-1)ˢ × 1.f × 2⁽ᵉ⁻¹²⁷⁾ 1.101(二進)× 2¹ = 3.25(十進) 小数点の位置を指数で表す 二進では0.5は正確に表せる 0.1は有限の桁では近似になる
正規化数の例。符号1ビット、指数8ビット、小数部23ビットを持つ。
ひよこ ひよこ
浮動小数点って何?
ペンギン先生 ペンギン先生
たとえば1.23×10²のように、仮数と指数で数を表す方法だよ。この十進の例は123。限られた桁数で幅広い大きさを扱えるけど、すべての数を正確に保存できるわけではないんだ。
ひよこ ひよこ
0.1+0.2が0.3にならないのはなぜ?
ペンギン先生 ペンギン先生
有限の二進の桁数では、0.1や0.2を正確に表せず近い値に丸めるからだよ。JavaScriptのNumberで計算すると0.30000000000000004になる。すべての言語や数値型で同じ表示になる、という意味ではないんだ。
ひよこ ひよこ
小数は全部ずれるの?
ペンギン先生 ペンギン先生
全部ではないよ。たとえば0.5は二進の0.1なので、正確に表せる。保存できる桁数や指数の範囲には限界があるため、どの数もどんな計算も正確という保証はないんだ。
ひよこ ひよこ
お金のように、十進の値をきちんと扱いたいときは?
ペンギン先生 ペンギン先生
用途に応じて十進のDecimalや、決めた最小単位の整数などを検討するよ。PythonのDecimalは固定小数点専用ではなく、十進の浮動小数点も扱う。精度、丸める時点、入力方法をそろえることが大切だね。
ひよこ ひよこ
単精度と倍精度はどう違うの?
ペンギン先生 ペンギン先生
IEEEの二進形式ではbinary32が32ビット、binary64が64ビットだよ。binary32の格納は符号1・指数8・小数部23ビット。通常の正規化数は先頭の1を省略しているので、仮数の精度は24ビットになる。0や非正規化数、無限大、NaNは別の扱いがあるんだ。
もっと詳しく知りたい人へ

Decimalを使えば、丸め誤差はすべてなくなる?

なくならない。PythonのDecimalは十進の浮動小数点演算を扱い、文字列から作る0.1や0.2は正確に表せるが、1÷3のような無限に続く値は設定した精度で丸める。二進floatから変換すると、すでに近似された値がそのまま変換されるので、入力の作り方と丸めの規則も確認する。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「浮動小数点」って出てきたら「仮数と指数で広い範囲の数を表す方式」と思えばだいたいOK!
📖 おまけ:英語の意味
「Floating Point」 = 小数点の位置が固定されない数の表現
💬 仮数と指数を組み合わせ、指数によって数の大きさを変える方式だよ。固定小数点とは、小数点の位置の扱いが違うんだ

参考資料

← 用語集にもどる