四倍精度
情報処理において、四倍精度(よんばいせいど、Quadruple Precision、あるいはQuad Presicionと略称)は、浮動小数点数の形式の1つである。四倍精度数(Quadruple-precision Number)とも呼ぶ。
以下、四倍精度浮動小数点数について示す。この128ビット四倍精度浮動小数点数は結果に倍精度以上の精度を必要とするアプリケーションのためだけに設計されたのではなく[1]、基本機能として、途中計算と一時変数のオーバーフローと丸め誤差の抑制により、結果が倍精度の数値演算により信頼性と正確性を与えるために設計された。 オリジナルのIEEE-754浮動小数点数の初期のアーキテクトであるWilliam Kahanは「現在拡張倍精度は、さらなる精度の計算とそれを速く動作させる実装の価値の妥当な妥協点である。すぐにでももう2バイトの精度が妥当になるだろう。そして究極的には16バイトフォーマットもが…。この種の、より広い精度への段階的な進化は既にIEEE 754の構成された時に見られる」と記している[2]。
IEEE 754-2008では、128ビットの二進フォーマットが公式にbinary128として言及されている。OpenCL では quad 型として浮動小数点数が予約データ型に入っている。
目次 |
IEEE 754 四倍精度二進浮動小数点フォーマット: binary128 [編集]
IEEE 754規格はbinary128を以下のように定めている。
これは十進換算で33-36桁の精度に相当する(十進小数→binary128→十進小数のラウンドトリップが可能な最大桁数が33桁、binary128→十進小数→binary128のラウンドトリップが可能な最大桁数が36桁[3])。
このフォーマットは、正規化数の場合は最上位の1が暗黙のうちに存在するものとして省略される(いわゆるケチ表現)。これにより113ビット(十進換算約34桁:
)の精度の仮数部の112ビットのみがメモリフォーマット上に現れる。ビットの配置は次のようになっている。
binary256は237ビット(十進換算約71桁)で指数のバイアスは262143となる。
指数のエンコーディング [編集]
四倍精度二進浮動小数点数の指数はオフセット16383のゲタ履き表現でエンコードされる。これはIEEE 754規格のexponent biasとして知られる。
- Emin = 000116−3FFF16 = −16382
- Emax = 7FFE16−3FFF16 = 16383
- バイアス = 3FFF16 = 16383
これにより、ゲタ履き表現の定義より、実際の指数を得るためには記録された指数部からオフセットの16383を引く必要がある。
指数部が000016と7FFF16の場合は、それぞれ、ゼロ・非正規数、無限大・NaNとして、特別に扱われる。
| 指数 | 仮数ゼロ | 仮数非ゼロ | 式 |
|---|---|---|---|
| 000016 | 0, −0 | 非正規化数 | ![]() |
| 000116, ..., 7FFE16 | 正規化数 | ![]() |
|
| 7FFF16 | ±∞ | NaN (quiet, signalling) | |
最小の真に正の値(非正規化数)は2−16493 ≈ 10−4965であり、1ビットの精度である。 最小の正の正規化数は2−16382 ≈ 3.3621 × 10−4932であり、112ビットの精度がある。 最大の表現可能な値は216384 - 216272 ≈ 1.1897 × 104932である。
四倍精度の例 [編集]
下記の例は浮動小数点数の16進数によるビット表現である。これは符号、(バイアスされた)指数、仮数を含む。
3fff 0000 0000 0000 0000 0000 0000 0000 = 1 c000 0000 0000 0000 0000 0000 0000 0000 = -2
7ffe ffff ffff ffff ffff ffff ffff ffff ≈ 1.189731495357231765085759326628007 × 104932 (最大の四倍精度浮動小数点数)
0000 0000 0000 0000 0000 0000 0000 0000 = 0 8000 0000 0000 0000 0000 0000 0000 0000 = -0
7fff 0000 0000 0000 0000 0000 0000 0000 = infinity ffff 0000 0000 0000 0000 0000 0000 0000 = -infinity
3ffd 5555 5555 5555 5555 5555 5555 5555 ≈ 1/3
デフォルトでは、1/3は倍精度と同様、切り捨てられる。これは仮数のビット数が奇数であるため、丸め位置以降のビット列が0101...となり、1/2ulpより小さいためである。
サポート [編集]
四倍精度をサポートする処理系やアーキテクチャについて述べる。
一部の処理系や、64ビットアーキテクチャの場合に long double が128ビット(sizeof(long double) が 16)のことがあるが、単に拡張倍精度フォーマットを格納するのに16バイトを使うだけであることもある。また、オプションで切り替える場合はバイナリ互換性がなくなることがありうるので注意を要する。独自拡張で(最新のGCCなど) __float128 といった型が使えることもあるが、文字列表現との相互変換などのサポートが十分でないこともある。
IBMのアーキテクチャには、次節で述べるdouble-doubleの原理による四倍精度の扱いをサポートしているものがある。
SPARC-V9には四倍精度浮動小数点演算の命令があるが、2012年現在これをハードウェアで実装した実機は無く、現状では命令はソフトウェアで実行される。
専用計算機では、GRAPE-MPが四倍精度に特化して設計されている。
(SSEでは128ビットレジスタを対象として浮動小数点演算を行うが、複数の単精度や倍精度演算を同時に行う機能のみで四倍精度演算のサポートはない。次節のdouble-doubleの実装に使用されることがある)
double-double演算 [編集]
有名なソフトウェア手法として、倍精度浮動小数点数のペアを用いて四倍精度に近い精度を実現する手法があり[4][5][6]、「double-double演算」や「擬似四倍精度」と呼ばれる。 仮数53ビットのIEEE倍精度数のペアを用いることで、double-double演算は少なくとも[4]2×53=106ビットの仮数(もしくは可能性としては符号ビットの巧妙な扱いにより107ビット[7])を実現可能である。これはIEEEのbinary128の113ビットよりわずかに少ないだけである。一方、指数は11ビットのままであるため、表せる値の範囲は基本的に倍精度と同じである[4]。これは四倍精度の15ビット仮数と比べ格段に劣る(double-doubleの
に対し、binary128は
)。 具体的には、double-double/四倍精度の値qをdouble-doubleの技術で表す場合、2つの倍精度数xとyのペアを用いてq=x+yという和の形で表現する。この各々はqの仮数の半分ずつを与える[5]。つまり、qの代わりに(x,y)というペアが保存されており、qに対する演算(加減乗除等)はxとyに対する等価な(ただし複雑な)演算に変換される。これにより、四倍精度の演算は(複数の)倍精度の演算へと簡略化される。倍精度演算は一般的にハードウェアに搭載されているため、double-double演算は通常、一般の任意精度演算よりも十分に高速である[5][4]。 なお、double-double演算は次のような特徴がある[8]。
- 値の絶対値が減少すると、追加の精度も減少する。そのため、正規化数の範囲での最小の数は倍精度よりも狭い。完全な精度を持つ最小の数は1000...02 (ゼロが106個) × 2-1074、あるいは 1.000...02 (ゼロが106個) × 2-968である。
- 実際の精度は変化する。一般に、ペアの下位パートの絶対値は上位パートのULPの半分を超えない。下位パートが上位パートのULPの半分より小さいならば、上位と下位の仮数の間に黙示的な全0あるいは全1のビットが存在する。仮数のビット数が固定であることに依存するアルゴリズムは128ビット長の倍精度数を使うとき失敗する可能性がある。
- 上の理由により、1 + 2-1074のような値を表現する事ができる。これは1より大きい表現可能な最小の値である。
更に高精度が要求されるならば、triple-double(159または161ビット精度)やquad-double(212または215ビット精度)演算を考えることもできる。
同様の手法で2つの四倍精度数からなるdouble-quad演算を考えることもできる。これは少なくとも226または227ビットの精度を持つ。[9]
八倍精度 [編集]
四倍精度より精度が高く、任意精度演算より高性能な計算のためのフォーマットとして、6倍から8倍までの精度が検討されており[10][11]、いくつかの方式によるソフトウェアによる実装の報告[12][13][14][15]、GRAPE-MP 4/6/8の試作や、FPGAへの実装[16]といったハードウェアの報告などがある。
関連項目 [編集]
References [編集]
- ^ David H. Bailey and Jonathan M. Borwein (2009年7月6日). “High-Precision Computation and Mathematical Physics”. 2012年11月13日閲覧。
- ^ Higham, Nicholas (2002). "Designing stable algorithms" in Accuracy and Stability of Numerical Algorithms (2 ed). SIAM. pp. 43.
- ^ William Kahan (1987年10月1日). “Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic”. 2012年11月13日閲覧。
- ^ a b c d Yozo Hida, X. Li, and D. H. Bailey, Quad-Double Arithmetic: Algorithms, Implementation, and Application, Lawrence Berkeley National Laboratory Technical Report LBNL-46996 (2000). Also Y. Hida et al., Library for double-double and quad-double arithmetic (2007).
- ^ a b c J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates, Discrete & Computational Geometry 18:305-363, 1997.
- ^ Knuth, D. E.. The Art of Computer Programming (2nd ed.). chapter 4.2.3. problem 9..
- ^ Robert MunafoF107 and F161 High-Precision Floating-Point Data Types (2011).
- ^ 128-Bit Long Double Floating-Point Data Type
- ^ sourceware.org Re: The state of glibc libm
- ^ KEK 「多倍長精度計算フォーラム」第2回研究会を開催
- ^ http://suchix.kek.jp/mpcomp/20111210-forum/mpcomp-forum.pdf 「多倍長精度演算の性能評価」(PDF)
- ^ http://www.apple.com/acg/pdf/oct3a.pdf "Octuple-precision floating point on Apple G4" (PDF)
- ^ http://ci.nii.ac.jp/naid/110008583401 「高性能な8倍精度浮動小数点演算機構の実現」
- ^ http://id.nii.ac.jp/1001/00071791/ 情報処理学会電子図書館「GPUによる4倍・8倍精度BLASの実装と評価」
- ^ http://kaken.nii.ac.jp/d/p/21540123 「Web上での簡便な8倍精度数値計算システムの構築」
- ^ http://ci.nii.ac.jp/naid/110008583401 「高性能な8倍精度浮動小数点演算機構の実現」
外部リンク [編集]
- High-Precision Software Directory
- QPFloat, a free software (GPL) software library for quadruple-precision arithmetic
- HPAlib, a free software (LGPL) software library for quad-precision arithmetic
- libquadmath, the GCC quad-precision math library
- IEEE-754 Analysis, Interactive web page for examining Binary32, Binary64, and Binary128 floating-point values

