浮動小数点数
この章の目標
IEEE 754 浮動小数点数の構造(符号・指数・仮数)、正規化数・非正規化数・特殊値の違い、機械イプシロンと丸めモードを理解する。
前提知識
- 2進数の基本(ビット、バイト)
- 指数表記の概念
§1 コンピュータでの数の表現
コンピュータは有限のビットで数を表現する。浮動小数点数(floating-point number)は、実数を近似的に表現する標準的な方法である。
浮動小数点表現
数 $x$ を次の形式で表す:
$$x = \pm m \times b^e$$ここで:
- $m$:仮数部(mantissa / significand)
- $b$:基数(base)、通常は2
- $e$:指数部(exponent)
例:10進数での浮動小数点
$12345 = 1.2345 \times 10^4$
$0.00678 = 6.78 \times 10^{-3}$
このように、小数点の位置を「浮動」させて表現する。
§2 IEEE 754規格
IEEE 754は、浮動小数点数の表現と演算の国際標準規格である。
主な形式
| 形式 | ビット数 | 符号 | 指数 | 仮数 | 有効桁数 |
|---|---|---|---|---|---|
| 単精度(float) | 32 | 1 | 8 | 23 | 約7桁 |
| 倍精度(double) | 64 | 1 | 11 | 52 | 約16桁 |
§3 正規化数
正規化数は、仮数部の最上位ビットが常に1になるように調整された数である。
正規化数の表現(倍精度)
$$x = (-1)^S \times 1.M \times 2^{E-1023}$$仮数部の「1.」は暗黙的に存在(ケチビット、hidden bit)し、実際には格納されない。これにより1ビット分の精度が稼げる。
この暗黙の「1.」は指数部 E が 1 以上のとき(正規化数)にのみ適用される。E = 0 の場合は暗黙ビットが「0.」に切り替わり、非正規化数やゼロを表す(§4 参照)。
例:$-6.5$ の表現
$-6.5 = -1.1010_2 \times 2^2$
- 符号 S = 1(負)
- 指数 E = 2 + 1023 = 1025 = $10000000001_2$
- 仮数 M = $1010000...0_2$(「1.」を除いた部分)
倍精度の範囲
- 最小正規化数:$\approx 2.2 \times 10^{-308}$
- 最大値:$\approx 1.8 \times 10^{308}$
§4 特殊な値
IEEE 754 では、指数部 E と仮数部 M の組合せにより、正規化数以外の値が定義されている。暗黙の先頭ビット(ケチビット)は E の値によって切り替わる。
| 指数部 E | 仮数部 M | 暗黙ビット | 解釈 | 値の式(倍精度) |
|---|---|---|---|---|
| 0 | 0 | — | ゼロ | $\pm 0$ |
| 0 | $\neq 0$ | 0. | 非正規化数 | $(-1)^S \times 0.M \times 2^{-1022}$ |
| 1〜2046 | 任意 | 1. | 正規化数 | $(-1)^S \times 1.M \times 2^{E-1023}$ |
| 2047 | 0 | — | 無限大 | $\pm\infty$ |
| 2047 | $\neq 0$ | — | NaN | 未定義 |
無限大(Infinity)
指数部がすべて1、仮数部がすべて0の場合。$1/0 = +\infty$、$-1/0 = -\infty$
NaN(Not a Number)
指数部がすべて1、仮数部が0でない場合。$0/0$、$\infty - \infty$ などの結果。
非正規化数(Subnormal)
指数部がすべて0の場合。0に近い非常に小さな数を表現。
ゼロ
指数部と仮数部がすべて0。$+0$ と $-0$ の2種類がある。
§5 機械イプシロン
機械イプシロン $\varepsilon_{\mathrm{mach}}$
$1 + \varepsilon \neq 1$ となる最小の正の浮動小数点数 $\varepsilon$。
これは浮動小数点数の「相対精度」を表す。
値
- 単精度:$\varepsilon_{\mathrm{mach}} \approx 1.2 \times 10^{-7}$($2^{-23}$)
- 倍精度:$\varepsilon_{\mathrm{mach}} \approx 2.2 \times 10^{-16}$($2^{-52}$)
機械イプシロンの意味
任意の実数 $x$ を浮動小数点数 $\mathrm{fl}(x)$ で表すとき:
$$\frac{|\mathrm{fl}(x) - x|}{|x|} \leq \frac{\varepsilon_{\mathrm{mach}}}{2}$$つまり、相対誤差は高々 $\varepsilon_{\mathrm{mach}}/2$ である。
§6 丸めモード
IEEE 754 では5つの丸めモードが定義されている。
- 最近接偶数丸め(roundTiesToEven, デフォルト):最も近い値に丸める。中間値は仮数部が偶数の側へ
- 最近接遠方丸め(roundTiesToAway):最も近い値に丸める。中間値は 0 から遠い方へ
- 0方向への丸め(roundTowardZero, 切り捨て)
- $+\infty$ 方向への丸め(roundTowardPositive, 切り上げ)
- $-\infty$ 方向への丸め(roundTowardNegative, 切り下げ)
丸めモードの使い分け早見表
| モード | 適する場面 | 適さない場面 |
|---|---|---|
| TiesToEven | 一般の科学技術計算(デフォルト)。統計的バイアスが最小 | 丸め方向の保証が必要な場面 |
| TiesToAway | 金融・会計(人間の直感に合う「四捨五入」) | 大量の加算(統計的バイアスがわずかに生じる) |
| TowardZero | 整数への変換 (C の (int)x)、符号対称な切り捨て |
精度が必要な反復計算 |
| Toward $+\infty$ | 区間演算の上界。結果の上限を保証したい場合 | 単独での通常計算(常に上方バイアス) |
| Toward $-\infty$ | 区間演算の下界。結果の下限を保証したい場合 | 単独での通常計算(常に下方バイアス) |
区間演算では Toward $+\infty$ と Toward $-\infty$ を組み合わせて使い、計算結果を確実に含む区間 $[\text{下界}, \text{上界}]$ を求める。
§7 まとめ
- 浮動小数点数:$\pm m \times 2^e$ の形式で実数を近似
- IEEE 754:国際標準規格。単精度(32bit)、倍精度(64bit)
- 正規化数:仮数部の先頭に暗黙の「1.」
- 特殊値:$\pm\infty$、NaN、$\pm 0$、非正規化数
- 機械イプシロン:$1 + \varepsilon \neq 1$ となる最小の $\varepsilon$
- 単精度で約7桁、倍精度で約16桁の10進精度