浮動小数とIEEE Arithmetic

数値解の品質トップへ

浮動小数とIEEE Arithmetic

浮動小数とは、表現できる数の範囲に不当な制限を加えることなく、計算機の有限語長で表現可能な実数のサブセットを言う。例えば2進浮動演算に対するANSI/IEEE標準 [IEEE, 1985] では64ビットを用い、概ね$10^{\pm308}$の範囲の倍精度実数が表現される。

浮動小数値(floating point number) $x$ は4つの整数を用いて次のように表現される。MATH ここに$b$基数(base, radix)、$t$精度(precision)、$e$指数範囲(exponent range)がMATH指数(exponent)、$m$仮数(mantissa, significand)と呼ばれる。ただし$m$MATHを満足する。$x\neq0$でかつ$m\geq b^{t-1}$であるとき$x$正規化(normalized)数と言う。$x$に関する別の等価な表現を記すと次のようになる。MATH ただし各桁の数はMATHを満たすものとする。$d_{1}\neq0$の場合には$x$は正規化されていることになる。$d_{1}=0$$x\neq0$の場合には$x$非正規化(denormalized)数と呼ばれる。$0$と最小の正規化数の間にある非正規化数をサブノーマル(subnormal)と言う。非正規化数は$t$桁の精度を持つわけではない点に注意。

次の例は現実的なものとは言えないがモデルの理解には役に立つ。

Example 2.1 (浮動小数)

MATH

すべての正規化数は$d_{1}=1$であり、$d_{2}$$0$または$1$である。すなわち$m$は2進整数 $m=10(=2)$ または $m=11(=3)$ のいずれかである。一方、非正規化数の場合は $m=01(=1)$ となる。従って最小の正の正規化数はMATH、最大の正規化数はMATHとなる。この系において、MATHはただ一つの正のサブノーマル数となる。非負の正規化数の全集合はMATH である。非負の浮動小数の集合を図示したものが図1である。ただしサブノーマル数は破線で示されている。


fig1.png
図1  浮動小数の例

MATH

浮動小数値は絶対的な意味において等間隔に配置されているわけではないが、相対的な間隔という意味では概ね均一である。今の場合、

MATH (1)
相対精度(unit roundoff, relative machine precision)と呼ばれる。これはある実数が与えられたとき、その実数と最近傍の浮動小数値との最大距離の$1$に比べた比率を表す。Example 2.1の場合、$u=\frac{1}{4}=0.25$である。実際、$1.0$から最も遠い実数は$1.25$であり、$2.0$から最も遠い実数は$2.5$である。この$u$は浮動小数の誤差解析において本質的な意味を持つ。

$\epsilon_{M}=2u$という値はマシン$\QTR{bs}{\epsilon}$(machine epsilon)と呼ばれる。

上記ANSI/IEEE標準(通常IEEE演算機能(IEEE arithmetic)と呼ばれ、もちろん$b=2$の場合もカバーする)は次の事項に関する仕様を規定する。

  • 浮動小数の形式

  • 基本的浮動小数演算の結果

  • 丸めモード(rounding modes)

  • 符合付き$0$(signed zero)、無限大($\pm\infty$)、非数(NaN: not-a-number)

  • 浮動小数例外とその扱い

  • 形式間の変換

ありがたいことに近年ではほとんどすべてのマシンがIEEE arithmeticを使用している。この他に基数に依存しない形の一般的なANSI/IEEE標準 [IEEE, 1987] も存在する。表tab1はANSI/IEEEの2進標準を示したものである。

形式 精度 指数部 指数範囲 近似精度
Single $24$ビット $8$ビット $10^{\pm38}$ $10^{-8}$
Double $53$ビット $11$ビット $10^{\pm308}$ $10^{-16}$
Extended $\geq64$ビット $\geq15$ビット $10^{\pm4932}$ $10^{-20}$


表1 IEEE arithmaticの形式

IEEE arithmeticのデフォルトの丸めモードはround to nearestである。この場合、実数はそれに最も近い浮動小数によって代表される(タイの場合の扱い規則については [Overton, 2001, Chapter 5] を参照)。

ANSI/IEEE標準は浮動小数点演算を標準化する上で大きな助けになるが、それを実装しているマシン間で計算を移し変えた場合に、計算結果が同一になることは保証されない点に注意。コンパイラの最適化、拡張精度レジスタの使用、FMA(fused multiply-add)といった項目によっては変動が起り得るからである。

浮動小数、IEEE arithmeticに関するさらなる議論については Higham [2002] と Overton [2001] を参照されたい。

$u$の値はLAPACK関数SLAMCH(単精度演算用)、あるいはDLAMCH(倍精度演算用)から得ることができる(引数CMACHで'e'を指定してコールする)。$u$の値はNAG Fortran Libraryルーチン X02AJF (Note1) によっても求めることができる。四捨五入ではなく切捨てを行うマシン上では$u$の代りに$\epsilon_{M}$の値が戻されるが、そのようなマシンは稀である。S/DLAMCHにおける'e'とはepsを意味するが、これと$\epsilon_{M}$を混同してはならない。Matlabの組込み変数epsはFortran 95/Fortran 2003の数値問合せ関数 epsilon [Metcalf and Reid, 1996; Metcalf etal., 2004] と同様、$\epsilon _{M}$の値を応答する [MathWorks]。




関連情報
Privacy Policy  /  Trademarks