FE EXAM

バイアス表現(負の指数も符号なしで表すトリック)

指数部は負の値も必要なのに、IEEE 754 ではなぜ「符号なしの 0〜255」で保存できているのか? 答えは「必ず +127 を足してから保存する」というシンプルな工夫です。

INTERACTIVE VISUALIZATION
実指数
バイアス値
保存値
実指数
+3
バイアス値
+127
保存値(10進)
130
保存値(2進 8 bit)
10000010
実指数+3
-127+127
プリセット
実指数 + バイアス値 = 保存値(符号なし整数)実指数+3+バイアス+127=保存値(符号なし)1302進8ビットでメモリに保存10000010= 130 (10進)範囲: 実指数 -127 〜 +127 を「保存値 0 〜 254」(実際は 1〜254、0と255は特殊)に対応させる保存ビット列をそのまま符号なしとして読めば、自然に大小比較もできる
解説

📌
バイアス表現とは

バイアス表現とは、負の数を含む値に「ある一定の数(バイアス)を必ず加算」して、符号なし整数として保存する方式のことです。浮動小数点数の指数部に使われています。

たとえば実指数 -3 をそのまま 8 ビットで表そうとすると「符号ビット」が必要で扱いが面倒。代わりに +127(バイアス)を足してから保存することにすると、+124 = 0〜255 の範囲内の符号なし整数になります。読み出すときは保存値から 127 を引けば元の実指数に戻ります。

身近な例で考えると、「西暦と昭和暦の変換」に似ています。西暦 = 昭和 + 1925。元号は 1〜64 の小さい数だけで済みますが、+1925 を足せば一意に西暦と対応します。バイアス表現は IEEE 754 における「元号」のようなものです。

📌
負の指数を扱う仕組み

実指数+ バイアス127保存値(10進)保存ビット列(2進)
-127-127 + 127000000000
-10-10 + 12711701110101
-3-3 + 12712401111100
+00 + 12712701111111
+33 + 12713010000010
+1010 + 12713710001001
+127127 + 12725411111110

この方式の嬉しい性質:
保存ビット列をそのまま符号なし整数として読むだけで大小比較ができる。たとえば 10000010 (130) > 01111101 (125) は実指数で +3 > -2 と同じ
・正と負の指数を1つのフォーマットで扱える(符号ビット不要)
・最小実指数(-127)は保存値 0、最大(+127)は保存値 254 にきれいに収まる(255 は特殊値「∞」「NaN」用に予約)

📌
IEEE 754でのバイアス値

バイアス値 = 2指数部ビット数 - 1 - 1単精度 (8 bit)バイアス = 127倍精度 (11 bit)バイアス = 10232⁷-1=127 / 2¹⁰-1=1023

IEEE 754 規格でのバイアス値は、指数部のビット数から機械的に決まります
・公式: バイアス = 2(指数部ビット数 - 1) − 1
単精度(指数部 8ビット)→ バイアス = 127
倍精度(指数部 11ビット)→ バイアス = 1023
半精度(指数部 5ビット)→ バイアス = 15

上のツールでスライダーを動かしてみてください。実指数を変えると、それに 127 が足された保存値とそのビット列がリアルタイムで切り替わります。たとえば実指数 0 のときは保存値 127 = 01111111(中央値)になります。

関連コンテンツ

バイアス表現 | Vizigo