浮動小数点数で「いつも1になる先頭ビット」を省略して、その分1ビット多く精度を稼ぐ仕組みです。実際に保存されるビット列と、計算で使う論理上の仮数部を見比べて理解しましょう。
ケチ表現とは、浮動小数点数において「いつも1になる先頭ビット」を省略する仕組みです。「先頭の1を書かないことでケチ(節約)する」というイメージから付けられた名前で、英語では implicit leading bit(暗黙の先頭ビット)と呼ばれます。
浮動小数点数では、値を1.xxx × 2の何乗という形に整える「正規化」を行います。
・6.5 = 1.101 × 2²
・0.75 = 1.1 × 2⁻¹
正規化したあとはどんな値でも、先頭は必ず「1.」から始まります(先頭が0だったら、もう1桁シフトできるからです)。
どうせ毎回「1」なら、わざわざ保存する必要はない──というのがケチ表現の発想です。上のツールの図解で「論理上の仮数部」と「実際に保存される仮数部」を見比べてください。先頭の 1. が消えているだけで、残りはまったく同じです。
ケチ表現の最大のメリットは、同じビット数の枠でより多くの情報を保存できることです。先頭の1を省略した分、空いた1ビット分だけ仮数を長く取れるので、精度(細かさ)がほぼ2倍になります。
IEEE 754 単精度(32ビット)の場合を見てみます。
・実際にメモリに保存される仮数:23ビット
・論理上扱える仮数:24ビット(暗黙の1を含む)
・つまり「メモリ容量はそのままで、精度を1ビット得した」ことになります
身近な例で考えると、郵便番号で「東京都」を毎回書く代わりに「都内なら省略」と決めるようなものです。必ず決まっている情報なら書かなくていい──このアイデアでビット数を節約しているのです。
ビット列を浮動小数点として10進数に直すときは、「保存されているビット列の先頭に1を補ってから計算する」ことを忘れないでください。
| 項目 | 値(IEEE 754 単精度の例) |
|---|---|
| 元の値 | 6.5 |
| 正規化形 | 1.101 × 2² |
| 論理上の仮数(計算で使う) | 1.10100000…(24ビット) |
| 実ビット(メモリに保存) | 10100000…(23ビット) |
| 違い | 先頭の「1.」が省略されている |
代表的な変換パターン:
・保存されたビット列 → 10進数の値:仮数部の先頭に「1.」を補って計算する
・10進数 → 保存ビット列:正規化して「1.xxx × 2^n」にし、「1.」を取り除いた残りを仮数として書く
・例外:ビット列が全部0の場合(指数も仮数も0)は値も0として扱う。ケチ表現の規則を適用しない特別ルールがあります
上の図解で橙色の点線枠が「保存されない暗黙の1」、青色の枠が「実際に保存されるビット」です。この2つを混同せず、計算するときは必ず先頭に「1」を補うことが、ケチ表現を扱う問題の唯一最大のコツです。