IEEE 754 浮動小数点数
この章の目標
第1章で学んだ浮動小数点数の基礎を前提に、IEEE 754 規格の詳細 — 規格の歴史と規定内容、NaN の 2 種類(qNaN / sNaN)、符号付きゼロの性質、段階的アンダーフロー、正しい丸め(correctly rounded)の保証 — を理解する。
前提知識
- 2進数の基礎(ビット、バイト)
- 浮動小数点数の基本概念
目次
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 クラス で利用できる。