浮動小数点数では「指数部」が値の大きさのスケール(何桁の数か)を担当します。指数を変えるたびに 2 のべき乗倍されて、小数点の位置が動きます。
指数部とは、浮動小数点数の中で「値のスケール(桁の大きさ)」を担当するパーツです。具体的には、2 の何乗で割増し/割引きするかを表します。
浮動小数点数の値の式は 1.M × 2E(仮数 × 指数部のべき乗)で表されます。仮数 1.M は 1.0〜2.0 の範囲に固定されているので、値が大きいか小さいかは指数部 E が決めるのです。
身近な例で考えると、「科学的表記」そのものです。1.5 × 103 = 1500 のように、頭の数字(仮数)は同じでも、10 のべき乗(指数)を変えれば「1500 円」にも「0.0015 円」にもできます。浮動小数点はこれを 10 ではなく 2 のべき乗で表現しているだけです。
指数部は負の値も持てる必要があります(とても小さい数を表すため)。でも 2進数のままだと負を表すのが面倒。そこで IEEE 754 では「バイアス表現」という工夫を使います。
仕組み(IEEE 754 単精度の場合):
・実指数に常に +127(バイアス)を加えてから、それを 2 進数 8 ビットで保存
・例: 実指数 0 → 保存値 127 → 2進数 01111111
・例: 実指数 +3 → 保存値 130 → 2進数 10000010
・例: 実指数 −3 → 保存値 124 → 2進数 01111100
これで保存される値は常に 0 以上の符号なし整数になり、ビット列の大小比較がそのまま指数の大小比較になるという利点があります。詳しくは「バイアス表現」のページで。
上のツールの上部に、8ビットの指数部のバイアス済みビット列が表示されています。スライダーで実指数を変えると、ビット列が変化するのが見えます。例えば実指数 0 のときは 01111111、+3 のときは 10000010 となります。
浮動小数点数が非常に大きな数も小さな数も扱えるのは、指数部のおかげです。指数を 1 増やすだけで値が 2 倍、1 減らすだけで 1/2 倍になり、わずか 8 ビットの指数部でも 2±127(約 10±38)もの範囲を表現できます。
固定小数点との比較:
・固定小数点: 「整数 16 ビット + 小数 16 ビット」のように刻みが固定。表せる範囲が狭い(おおよそ ±65536 まで)が、誤差は一定
・浮動小数点: 仮数 + 指数で刻みが可変。表せる範囲が非常に広い(約 ±1038)が、値が大きい領域では刻みも大きくなり、精度は粗くなる
上のツールで指数を +10 にしてみてください。1.5 × 2¹⁰ = 1536 になります。逆に −10 にすると約 0.001 になります。同じ 1.5 という仮数でも、指数部だけで値の桁数がこれだけ変わる──これが浮動小数点が「広範囲」と言われる理由です。