四倍精度浮動小数点数
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/10/14 23:48 UTC 版)
四倍精度浮動小数点形式(よんばいせいどふどうしょうすうてん、英語: quadruple-precision floating-point format)は、浮動小数点数の形式の1つで、よく使われている通常の倍精度形式と比して、仮数部の長さが約2倍である。
Nicholas J. Higham『Accuracy and Stability of Numerical Algorithms』(2nd.e)が、カハンの言として引用している文によれば、
For now the 10-byte Extended format is a tolerable compromise between the value of extra-precise arithmetic and the price of implementing it to run fast; very soon two more bytes of precision will become tolerable, and ultimately a 16-byte format ... That kind of gradual evolution towards wider precision was already in view when IEEE Standard 754 for Floating-Point Arithmetic was framed.[1]
(訳)これまでのところは、10バイトの拡張倍精度は、高精度演算の価値と高速に動作させるための実装コストとの間の妥協点としては許容できるものです。そうしてすぐにさらに2バイト分長い精度が妥当になるでしょう。そうして究極的には16バイトフォーマットもが…。この種の、より広い精度への段階的な進化はIEEE 754の規格が形成された時には既に想定されていました。
とのことである。(編注: 英語版Wikipediaが孫引きしている。英語版Wikipediaの引用元が示している引用元は「W. Kahan. Computer benchmarks versus accuracy. Draft manuscript, June 1994.」となっている)
IEEE 754-2008では、128ビットの二進フォーマットが公式にbinary128として定義された。次に示す。
IEEE 754 四倍精度二進浮動小数点フォーマット: binary128
IEEE 754-2008は四倍精度二進浮動小数点フォーマットbinary128を以下のように定めている。
これは十進換算で33桁〜36桁に相当する(十進小数→binary128→十進小数のラウンドトリップが可能な最大桁数が33桁、binary128→十進小数→binary128のラウンドトリップが可能な最大桁数が36桁[2])。
このフォーマットは、正規化数の場合は最上位の1が暗黙のうちに存在するものとして省略される(いわゆるケチ表現)。これにより113ビット(十進換算約34桁:
指数部
他の精度の場合と同様に、指数はゲタ履き表現(IEEE 754ではexponent bias)で、オフセットは16383である。特別な場合(後述)についても基本的に他と同様である。
- Emin = 000116−3FFF16 = −16382
- Emax = 7FFE16−3FFF16 = 16383
- バイアス = 3FFF16 = 16383
ゲタ履き表現なので、実際の指数を得るには、ビットパターンによる表現からオフセットの16383を引く。
指数部が000016と7FFF16の場合は特別な場合で、それぞれ、ゼロ・非正規数、無限大・NaNの表現である。
指数 | 仮数ゼロ | 仮数非ゼロ | 式 | |
---|---|---|---|---|
000016 | 0, −0 | 非正規化数 | ![]() |
この節の加筆が望まれています。
|
TBD
例
ここでは十六進で表現する。符号、(バイアスされた)指数、仮数の、全てを含んでいる。
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より小さいためである。
サポート
四倍精度をサポートする処理系やアーキテクチャについて述べる。
利用者数が極めて少ないためか、利用環境は整っているとは言い難い現状がある。まず、処理系の独自拡張としての実装は存在するが、標準の言語仕様では四倍精度が定義されていない(独自拡張は、可搬性(portability)が必要な場合は利用できない)。マイクロプロセッサのハードウェアサポートは、携帯端末用は無論パーソナルコンピュータ用やサーバ用を含めほとんどが、倍精度までであり、ソフトウェアによる処理は一般に数倍以上遅い。
一部の処理系や、64ビットアーキテクチャの場合にC言語で long double
が128ビット(sizeof(long double)
が 16)のことがあるが、単に拡張倍精度フォーマットを格納するのに16バイトを使うだけであることもある。また、オプションで切り替える場合はバイナリ互換性がなくなることがありうるので注意を要する。独自拡張で(最新のGCCなど) __float128
といった型が使えることもあるが、文字列表現との相互変換などのサポートが十分でないこともある。最近のGNU FORTRAN (gfortran) にはIEEE754の四倍精度のサポートがある。
IBMのアーキテクチャには、次節で述べるdouble-doubleの原理による四倍精度の扱いをサポートしているものがある。また、IBM Power9 (POWER ISA3.0)では、IEEE 754 の4倍精度FPと4倍精度十進FPをサポートした。
命令セットとしては用意があるがハードウェアでのサポートが無く、ソフトウェア実行になるというプラットフォームもある。たとえばSPARC-V9には四倍精度浮動小数点演算の命令があるが、2012年現在これをハードウェアで実装したSPARCの実機は無く、ソフトウェアで実行される。
専用計算機等での実装例の報告は少なくない。たとえばGRAPE-MPのように多倍長精度に特化した設計などもある。
(SSEでは128ビット長のレジスタを対象として浮動小数点演算を行うが、複数の単精度や倍精度演算を同時に行う機能のみで四倍精度演算のサポートはない。次節のdouble-doubleの実装に使用されることがある)
double-double演算
通常の倍精度浮動小数点形式のペアを用いて、四倍精度による処理を擬似的に実現する手法がある[3][4][5]。その手法を「double-double演算」などといい、またそれによって擬似的に実現されている四倍精度が「擬似四倍精度」などと言われることがある。「double-double演算」は固定精度の計算となるため、任意精度の計算と比較して高速に計算できる[3]。
真の四倍精度計算とは異なり、仮数53ビットのIEEE倍精度数の1対を用いることで、double-double演算は少なくとも[3]2×53=106ビットの仮数(もしくは可能性としては符号ビットの巧妙な扱いにより107ビット[6])を実現する計算手法である。これはIEEEのbinary128の113ビットの仮数よりも7ビット短いだけである。一方、指数部は11ビットのままであるので、表現できる値の大きさの範囲は基本的に倍精度と同じである[3]。これは四倍精度の指数部が15ビットであることに比べて格段に劣る(double-doubleのカテゴリ
- 四倍精度浮動小数点数のページへのリンク