2進数の実数は、コンピュータの中で特別な方法で保存されなければならない。コンピュータは2進数の整数(2の累乗の整数)として数を表現するので、基数がないため小数のような非整数の数を直接表現することはできない。浮動小数点とは、指数(累乗)を乗じたときに基数が大きくなったり小さくなったりすることを意味する。
浮動小数点の基本概念
浮動小数点は、数を「仮数(significand または mantissa)」と「指数(exponent)」、「符号(sign)」で表す方式です。これは人間の指数表記(例えば 6.02×10^23)と同じ考え方で、2進数における実数を有限ビットで近似的に表現します。一般に
- 符号:正か負かを示す1ビット。
- 指数部:仮数をどれだけシフト(乗算・除算)するかを示すビット列。バイアス(bias)が用いられ、符号付きの指数を扱いやすくする。
- 仮数(小数部分):有効桁(精度)を表すビット列。正規化(normalized)された表現では暗黙の先頭1(implicit leading 1)が仮定されることが多い。
IEEE 754 標準(代表的な実装)
現在の多くのコンピュータは IEEE 754 標準に基づいた浮動小数点を使います。代表的な形式は次のとおりです:
- 単精度(single, 32ビット):符号1ビット、指数8ビット、仮数23ビット。指数のバイアスは127。
- 倍精度(double, 64ビット):符号1ビット、指数11ビット、仮数52ビット。指数のバイアスは1023。
正規化された数では仮数の先頭ビットは常に1になるため、IEEE 754ではその先頭1を省略して表現し(暗黙の1)、仮数部により多くの有効ビットを与えています。
特殊値と非正規化数
- ゼロ(+0, −0):指数と仮数がすべて0の場合、符号に応じて +0 と −0 が表現される。
- 無限大(±∞):指数がすべて1、仮数がすべて0 のとき。
- NaN(非数):指数がすべて1、かつ仮数が 0 でないとき。計算エラーや未定義の結果を表す。
- 非正規化数(subnormal/denormal):指数がすべて0のとき、暗黙の1が使われず小さい数を表現できる。これによりゼロに連続的に近づけられるが、精度は低下する。
丸めと誤差の性質
浮動小数点は有限ビットしか持たないため、ほとんどの実数を有限ビットで 正確に 表せません。そのため丸め誤差が生じます。IEEE 754 ではいくつかの丸めモードが定義されています(最近接へ丸め、ゼロ方向へ丸め、プラス無限大方向、マイナス無限大方向など)。
よくある問題点:
- 10進では有限小数でも、2進では循環小数になり正確に表せない(例:0.1 は2進で非終端)。
- 桁落ち(catastrophic cancellation):ほぼ等しい数同士の引き算で有効桁が失われる。
- 累積誤差:多数の演算を行うと誤差が積み重なることがある。
簡単な変換例
例えば十進の 5.75 を 2進浮動小数点で表す手順:
- 整数部 5 → 2進: 101
- 小数部 0.75 → 2進: 0.11(0.5 + 0.25)
- 合成すると 101.11 = 1.01111 × 2^2(正規化)
- 仮数部は先頭の「1」を暗黙とし、残りを格納:仮数 = 01111...、指数は 2 をバイアスで表す。
実務上の注意点
- 比較:浮動小数点の等号比較は注意が必要。差が小さい場合は許容誤差(イプシロン)を使って比較する。
- 数値アルゴリズムの選択:丸めや桁落ちに強いアルゴリズムを選ぶことが重要。
- 必要なら高精度型(倍精度や任意精度ライブラリ)を利用する。
以上が2進数における浮動小数点数の保存方法とその仕組みの要点です。IEEE 754 の細かな規定や各言語・プラットフォームでの実装差異にも留意してください。