浮動小数点で値を保存する前に必ず行う処理が「正規化」です。2進数の小数点を移動させて、必ず先頭が「1.」になる形に整えるプロセスを、ステップごとに確認します。
正規化とは、浮動小数点数を 「1.xxx × 2E」 の形に書き直す操作のことです。値そのものは変わりませんが、表現の形が決まった「標準形」に揃います。
たとえば 10 進数の 6.5 は 2 進数では 110.1 ですが、これを正規化すると 1.101 × 2² になります。小数点を 2 桁左に動かしたぶん、指数として 2² を掛けて辻褄を合わせます。
身近な例で考えると、科学的記数法そのものです。1500 を 1.5 × 10³ と書くのと同じ発想です。浮動小数点はこれを 10 ではなく 2 のべき乗で行います。
ある数を 2 進数で表す方法は無限にあります。たとえば 6.5 は次のように全部「同じ値」ですが書き方は違います。
・110.1 × 2⁰
・1.101 × 2² ← 正規化形
・0.1101 × 2³
・11010 × 2⁻¹
これだと「同じ値なのに表現が複数」あって、コンピュータが扱いにくい。「必ず 1.xxx の形」に決めれば、表現が一意になる──というのが正規化の目的の1つです。
もう1つの大きな利点は、先頭が必ず 1 になるので、その 1 を保存しなくて済むこと(ケチ表現/暗黙の 1)。これで仮数部のビット数を 1 つ節約できて、その分だけ精度が上がります。
仮数部は 1.0 〜 ほぼ 2.0 の範囲に固定されているため、ビット数全部を「小数点以下の細かさ」に使えます。これが精度の良さに直結します。
もし正規化していないと、たとえば仮数が 0.0011 のような先頭に 0 が並ぶ形でも許容することになります。すると先頭の 0 を保存するためのビットが無駄になり、本当に意味のある桁の数が減って精度が落ちてしまいます。
正規化のポイント:
・正規化を行う目的 → 表現の一意性 + ケチ表現で精度を稼ぐ
・正規化した値の仮数の範囲 → 1.0 ≤ M < 2.0(暗黙の 1 を含めた場合)
・正規化できない特殊な値 → 0 と、特殊な ±∞・NaN
上のツールでプリセット「0.1」を試してみてください。0.0001100110011...(循環小数)になります。これを正規化すると 1.100110011... × 2⁻⁴。指数 -4 で 1/16 倍になり、仮数の有効桁数を最大限活用できる形になります。