浮動小数点数

この章の目標

IEEE 754 浮動小数点数の構造(符号・指数・仮数)、正規化数・非正規化数・特殊値の違い、機械イプシロンと丸めモードを理解する。

前提知識

  • 2進数の基本(ビット、バイト)
  • 指数表記の概念
目次

§1 コンピュータでの数の表現

コンピュータは有限のビットで数を表現する。浮動小数点数(floating-point number)は、実数を近似的に表現する標準的な方法である。

浮動小数点表現

数 $x$ を次の形式で表す:

$$x = \pm m \times b^e$$

ここで:

  • $m$:仮数部(mantissa / significand)
  • $b$:基数(base)、通常は2
  • $e$:指数部(exponent)

$m$ の桁数(精度)と $e$ の範囲が固定されるので、表せる数は有限個である。

例: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 参照)。

本節はビット配分と基本形式に絞った導入である。丸めモードは §6 で、特殊値の詳細・段階的アンダーフロー・正しい丸めの保証など IEEE 754 規格の深掘りは 次章「IEEE 754 浮動小数点数」 で扱う。

§3 正規化数

正規化数は、有効数字 $1.M$ の先頭が常に 1 になるように指数を調整した数である(先頭の 1 は格納しないので、格納される仮数部 $M$ の最上位ビットは 0 のこともある)。

正規化数の表現(倍精度)

$$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\ldots0_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数値ではない(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$ と $-0$ の2種類がある。

例:最小の非正規化数(倍精度)

$E = 0$, $M$ は最下位ビットのみ 1($M = 0\ldots001$)のとき:

$$x = 1 \times 2^{-52} \times 2^{-1022} = 2^{-1074} \approx 4.9 \times 10^{-324}$$

これは正規化数の最小値 $\approx 2.2 \times 10^{-308}$ より $2^{52} \approx 4.5 \times 10^{15}$ 倍小さい。非正規化数の領域では精度(仮数の有効ビット数)が徐々に失われる代わりに、アンダーフロー時のゼロへの落ち込みを段階的に緩和する。

§5 機械イプシロン

機械イプシロン $\varepsilon_{\mathrm{mach}}$

1 と、1 より大きい最小の浮動小数点数との差 $\varepsilon_{\mathrm{mach}}$(倍精度で $2^{-52}$)。最近接丸めのときの丸めの単位は $u = \varepsilon_{\mathrm{mach}}/2$ である。

注:最近接丸めでは、$1 + \varepsilon \neq 1$ となる最小の正の浮動小数点数 $\varepsilon$ はこの約半分($2^{-53}$ をわずかに上回る数)で、$\varepsilon_{\mathrm{mach}}$ とは一致しない。

これは浮動小数点数の「相対精度」を表す。

値

  • 単精度:$\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)$ に丸めるとき:

$$\dfrac{|\mathrm{fl}(x) - x|}{|x|} \leq \dfrac{\varepsilon_{\mathrm{mach}}}{2}$$

つまり、相対誤差は高々 $\varepsilon_{\mathrm{mach}}/2$ である。

§6 丸めモード

IEEE 754 では5つの丸めモードが定義されている(うち roundTiesToAway は十進形式でのみ必須で、二進形式の単精度・倍精度では実装されていないことが多い)。

  • 最近接偶数丸め(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 は丸めモードによらず常に 0 方向へ切り捨てる。範囲外や NaN の変換は未定義動作) 精度が必要な反復計算
Toward $+\infty$ 区間演算の上界。結果の上限を保証したい場合 単独での通常計算(常に上方バイアス)
Toward $-\infty$ 区間演算の下界。結果の下限を保証したい場合 単独での通常計算(常に下方バイアス)

区間演算では Toward $+\infty$ と Toward $-\infty$ を組み合わせて使い、計算結果を確実に含む区間 $[\text{下界}, \text{上界}]$ を求める。

§7 まとめ

  • 浮動小数点数:$\pm m \times 2^e$ の形式で実数を近似
  • IEEE 754:国際標準規格。単精度(32bit)、倍精度(64bit)
  • 正規化数:有効数字 $1.M$ の先頭の「1.」は暗黙(格納しない)
  • 特殊値:$\pm\infty$、NaN、$\pm 0$、非正規化数
  • 機械イプシロン:1 と、1 より大きい最小の浮動小数点数との差(倍精度で $2^{-52}$)
  • 単精度で約7桁、倍精度で約16桁の10進精度

よくある質問

Q1. 浮動小数点数とは何ですか?

浮動小数点数は、実数をコンピュータで近似的に表現する形式で、$\pm m \times 2^e$ の形で表される。IEEE 754 規格で標準化されており、単精度(32ビット、約7桁精度)と倍精度(64ビット、約16桁精度)が広く使われている。

Q2. 機械イプシロンとは何ですか?

機械イプシロン $\varepsilon_{\mathrm{mach}}$ は、1 と、1 より大きい最小の浮動小数点数との差で、浮動小数点数の相対精度を表す。倍精度では $2^{-52} \approx 2.2 \times 10^{-16}$ である。正規化数の範囲の実数を最近接丸めで浮動小数点数に丸めたときの相対誤差は、$\varepsilon_{\mathrm{mach}}/2$ 以下になる。

Q3. NaN とは何ですか?

NaN(Not a Number)は IEEE 754 で定義された特殊値で、$0/0$ や $\infty - \infty$ などの結果を表す。指数部がすべて 1 で仮数部が 0 でない場合に NaN となる。NaN は自分自身を含むどの値とも「等しくない」とみなされ、== や < などの比較はすべて偽、!= だけが真になる(この性質から x != x で NaN を判定できる)。