IEEE 754 浮動小数点数

この章の目標

第1章で学んだ浮動小数点数の基礎を前提に、IEEE 754 規格の詳細 — 規格の歴史と規定内容、NaN の 2 種類(qNaN / sNaN)、符号付きゼロの性質、段階的アンダーフロー、正しい丸め(correctly rounded)の保証 — を理解する。

前提知識

目次

1. 概要

IEEE 754(正式名称: IEEE Standard for Floating-Point Arithmetic)は、浮動小数点演算の国際標準規格である。1985年に初版が策定され(IEEE 754-1985)、2008年に改訂(IEEE 754-2008)、2019年に最新版(IEEE 754-2019)が発行された。

現在のほぼすべてのプロセッサ(CPU、GPU)がこの規格に準拠しており、プログラミング言語の float(単精度)や double(倍精度)はこの規格に基づいている。

IEEE 754 が規定するもの

  • 数の表現形式(符号・指数・仮数のビット構成)
  • 特殊値($\pm\infty$, NaN, $\pm 0$)
  • 丸め規則(5種類の丸めモード)
  • 基本演算($+, -, \times, \div, \sqrt{\phantom{x}}$)の正確な丸めの保証
  • 例外処理(無効操作、ゼロ除算、オーバーフロー、アンダーフロー、不正確)

2. 特殊値の詳細

特殊値の基本(指数部と仮数部の組合せ)は第1章で解説した。ここでは実用上重要な詳細を補足する。

NaN の 2 種類

NaN には quiet NaN(qNaN: 伝播するが例外を発生しない)と signaling NaN(sNaN: 使用時に例外を発生する)の2種類がある。

NaN の検出にはプログラム上で「自分自身との比較が false」になる性質を利用できる:

x = 0.0 / 0.0  // NaN
x == x         // false(NaN の検出に使える)
x != x         // true

符号付きゼロ($\pm 0$)の性質

$+0$ と $-0$ は比較では等しい($+0 == -0$ は true)が、$1/(+0) = +\infty$, $1/(-0) = -\infty$ と区別される。

3. 段階的アンダーフロー

非正規化数(サブノーマル数)により、最小正規化数とゼロの間のギャップが埋められ、段階的アンダーフロー(gradual underflow)が実現される。

非正規化数は正規化数より有効桁数が少ないが、$x - y = 0 \Rightarrow x = y$ という重要な性質を保証する。非正規化数がなければ、異なる値 $x \neq y$ に対して $\text{fl}(x - y) = 0$($\text{fl}$ は浮動小数点数への丸め)となるケースが発生し、アルゴリズムの正当性が損なわれる。

IEEE 754-2008 ではさらに半精度(16ビット)、四倍精度(128ビット)なども規定されている。

4. 正しい丸めの保証

IEEE 754 では、基本演算($+, -, \times, \div, \sqrt{\phantom{x}}$)の結果が正しく丸められる(correctly rounded)ことが保証される。すなわち、結果は「無限精度で演算を行い、その結果を丸めた値」と一致する。

丸めモードの種類は第1章 §6で列挙している。デフォルトは最近接偶数丸め(round to nearest, ties to even)である。

この「正しい丸め」により、任意の浮動小数点演算 $\text{fl}(a \circ b)$ は

$$\text{fl}(a \circ b) = (a \circ b)(1 + \delta), \quad |\delta| \le \varepsilon_{\text{mach}}$$

と表される。この性質は数値安定性の解析の基盤であり、誤差解析において繰り返し用いられる。

5. よくある質問

Q1. IEEE 754 とは何ですか?

浮動小数点演算の国際標準規格であり、数の表現形式、丸め規則、特殊値、例外処理を規定している。1985年に初版が策定され、現在のほぼすべてのプロセッサがこの規格に準拠している。

Q2. 倍精度浮動小数点数の有効桁数は何桁ですか?

仮数部は52ビット(暗黙の1ビットを含めて53ビット)であり、10進数で約15--16桁の有効数字に相当する。計算機イプシロンは $2^{-52} \approx 2.22 \times 10^{-16}$ である。

Q3. NaN とは何ですか?

$0/0$、$\infty - \infty$、$\sqrt{-1}$ など数学的に定義されない演算の結果を表す特殊値である。NaN は自分自身を含むあらゆる値との比較で false を返す($\text{NaN} \neq \text{NaN}$ が true)という特殊な性質をもつ。

6. 参考資料

  • Wikipedia「IEEE 754」(日本語版)
  • Wikipedia「IEEE 754」(英語版)
  • Wikipedia「Double-precision floating-point format」(英語版)
  • D. Goldberg, "What Every Computer Scientist Should Know About Floating-Point Arithmetic," ACM Computing Surveys, vol. 23, no. 1, pp. 5--48, 1991.
  • IEEE 754-2019, IEEE Standard for Floating-Point Arithmetic, IEEE, 2019.
  • M. L. Overton, Numerical Computing with IEEE Floating Point Arithmetic, SIAM, 2001.

calx での実装

この記事のアルゴリズムは calx の Float クラス で利用できる。