浮動小数点数

この章の目標

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桁
単精度浮動小数点数(32ビット) 符号部 S 1bit 指数部 E 8bit 仮数部 M 23bit 正規化数: 値 = (-1)S × 1.M × 2(E−127)
図1. 単精度(float, 32ビット)のビット配分。バイアス値は 127。数式は正規化数の場合(§3 参照)。
倍精度浮動小数点数(64ビット) 符号部 S 1bit 指数部 E 11bit 仮数部 M 52bit 正規化数: 値 = (-1)S × 1.M × 2(E−1023)
図2. 倍精度(double, 64ビット)のビット配分。バイアス値は 1023。仮数部が 52 ビットに増え、有効桁数が約 16 桁になる。数式は正規化数の場合(§3 参照)。

§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暗黙ビット解釈値の式(倍精度)
00ゼロ$\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}$
20470無限大$\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, 切り下げ)
正の数の丸め(a < x < b, a と b は隣接する浮動小数点数) 0 a (仮数部偶数) 中間点 b (仮数部奇数) x₁ x₂ x₁ (a寄り) x₂ (b寄り) TiesToEven (デフォルト) 中間点→a(仮数部偶数) TiesToAway 中間点→b(0から遠い方) TowardZero (切り捨て) 常に a 方向 Toward +∞ (切り上げ) 常に b 方向 Toward −∞ (切り下げ) 常に a 方向
図3. 丸めモードの比較(正の数)。x₁ (a寄り) と x₂ (b寄り) の 2 ケースを示す。①② は常に最近接へ、③⑤ は常に a (0方向/−∞方向) へ、④ は常に b (+∞方向) へ丸められる。中間点では ① と ② の挙動だけが異なる。
負の数の丸め(a < x < b, a と b は隣接する浮動小数点数) 0 a (仮数部奇数) 中間点 b (仮数部偶数) x₁ x₂ x₁ (a寄り) x₂ (b寄り) TiesToEven (デフォルト) 中間点→b(仮数部偶数) TiesToAway 中間点→a(0から遠い方) TowardZero (切り捨て) 常に b 方向 (0寄り) Toward +∞ (切り上げ) 常に b 方向 Toward −∞ (切り下げ) 常に a 方向
図4. 丸めモードの比較(負の数)。正の場合と比べ、③ TowardZero と④ Toward +∞ が同じ方向 (b = 0寄り) になり、⑤ Toward −∞ が反対方向 (a = 絶対値大) になる。

丸めモードの使い分け早見表

モード適する場面適さない場面
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進精度