指数部は負の値も必要なのに、IEEE 754 ではなぜ「符号なしの 0〜255」で保存できているのか? 答えは「必ず +127 を足してから保存する」というシンプルな工夫です。
バイアス表現とは、負の数を含む値に「ある一定の数(バイアス)を必ず加算」して、符号なし整数として保存する方式のことです。浮動小数点数の指数部に使われています。
たとえば実指数 -3 をそのまま 8 ビットで表そうとすると「符号ビット」が必要で扱いが面倒。代わりに +127(バイアス)を足してから保存することにすると、+124 = 0〜255 の範囲内の符号なし整数になります。読み出すときは保存値から 127 を引けば元の実指数に戻ります。
身近な例で考えると、「西暦と昭和暦の変換」に似ています。西暦 = 昭和 + 1925。元号は 1〜64 の小さい数だけで済みますが、+1925 を足せば一意に西暦と対応します。バイアス表現は IEEE 754 における「元号」のようなものです。
| 実指数 | + バイアス127 | 保存値(10進) | 保存ビット列(2進) |
|---|---|---|---|
| -127 | -127 + 127 | 0 | 00000000 |
| -10 | -10 + 127 | 117 | 01110101 |
| -3 | -3 + 127 | 124 | 01111100 |
| +0 | 0 + 127 | 127 | 01111111 |
| +3 | 3 + 127 | 130 | 10000010 |
| +10 | 10 + 127 | 137 | 10001001 |
| +127 | 127 + 127 | 254 | 11111110 |
この方式の嬉しい性質:
・保存ビット列をそのまま符号なし整数として読むだけで大小比較ができる。たとえば 10000010 (130) > 01111101 (125) は実指数で +3 > -2 と同じ
・正と負の指数を1つのフォーマットで扱える(符号ビット不要)
・最小実指数(-127)は保存値 0、最大(+127)は保存値 254 にきれいに収まる(255 は特殊値「∞」「NaN」用に予約)
IEEE 754 規格でのバイアス値は、指数部のビット数から機械的に決まります。
・公式: バイアス = 2(指数部ビット数 - 1) − 1
・単精度(指数部 8ビット)→ バイアス = 127
・倍精度(指数部 11ビット)→ バイアス = 1023
・半精度(指数部 5ビット)→ バイアス = 15
上のツールでスライダーを動かしてみてください。実指数を変えると、それに 127 が足された保存値とそのビット列がリアルタイムで切り替わります。たとえば実指数 0 のときは保存値 127 = 01111111(中央値)になります。