符号・指数・仮数の解説
IEEE 754浮動小数点数の3つの構成要素:符号ビット、バイアス付き指数、仮数(有効数字)について、実例を交えて深く掘り下げます。
Decimal Value
-6.5
Float32 Hex
0xC0D00000
Float64 Hex
0xC01A000000000000
詳細な説明
すべてのIEEE 754浮動小数点数は、2進数の科学的記数法を使用して値を表現するために協調する3つのフィールドで構成されています。各フィールドの理解が浮動小数点演算を習得する鍵です。
1. 符号ビット
符号ビットは最上位ビットです。正の数(+0と+Infinityを含む)では0、負の数(-0と-Infinityを含む)では1です。NaN値の場合、符号ビットは0または1のいずれかです。
2. 指数フィールド(バイアス付き)
指数は、負の指数を別の符号ビットなしで表現できるようにバイアスを付けて格納されます。float32ではバイアスは127、float64では1023です。実際の指数は格納値からバイアスを引いた値です。
特殊な指数値:
- すべてゼロ(0): 非正規化数またはゼロ
- すべて1(float32で255、float64で2047): 無限大またはNaN
- 1から254(float32)/ 1から2046(float64): 正規化数
3. 仮数(有効数字)
正規化数では、格納されない暗黙の先頭1があります。仮数フィールドは小数部分を表します。したがって、実際の有効数字はバイナリで1.仮数ビットです。
非正規化数では、暗黙のビットは1ではなく0になり、有効数字は0.仮数ビットになります。
計算例: -6.5
- 6.5をバイナリに変換:
110.1 - 正規化:
1.101 x 2^2 - 符号 = 1(負)
- 指数 = 2 + 127 = 129 = バイナリで
10000001 - 仮数 =
101の後に20個のゼロ(合計23ビット)
結果: 1 10000001 10100000000000000000000 = 0xC0D00000
検証: (-1)^1 x (1 + 0.5 + 0.125) x 2^2 = -1 x 1.625 x 4 = -6.5
暗黙のビットの仕組み:
正規化数で先頭の1を格納しないことにより、IEEE 754は無料で1ビット分の精度を獲得します。つまり、float32は23ビットしか格納されていなくても実質24ビットの有効数字精度を持ち、float64は52ビットしか格納されていなくても53ビットを持ちます。
ユースケース
符号・指数・仮数の分解の理解は、数値アルゴリズムのデバッグ、浮動小数点データのカスタムシリアル化の実装、またはIEEE 754演算を正しく処理する必要があるコンパイラやインタプリタの開発において重要です。