IBM AIX やMacOSX PowerPC版は128 ビットの長倍精度データ型をサポートしておりたとえばlong doubleは有効桁が32桁ほどある。が、これは本物の「四倍精度」ではない。double-doubleと呼ばれたりすることもある。時々Power970はハードウェアで四倍精度をサポートする、などと事実誤認がある。クリアにするため、これについて少し解説する。
倍精度(IEEE754-1984ではdouble precision, IEEE754-2008ではbinary64)は有効桁が16桁ほどであり、計算の精度が足りない場合が出てくる。このときは所謂四倍精度などを用いたりするが、驚くべきことに、所謂四倍精度に相当するものがIEEE754で定義されたことは2008年までなく、IEEE754-2008になって、初めてbinary128というフォーマットが定義され、所謂四倍精度が規格化された。cf.
draft 1.2.9, 27 January 2007 (最終パブリックドラフト)へのリンク。従って、我々が何となく四倍精度と呼んでいたものは、全て自分で勝手に名乗っていただけで、何か標準的な規格は無かった。問題のある表現である。
AIXは、128-bit long double data type (128 ビットの長倍精度データ型)をサポートしており、時折四倍精度とよぶ人もいる。これは、Knuth, Dekkerらによる、浮動小数点に於ける二つの数の和および積の厳密な誤差分離の定理(正しい名称を知りません...)を用いた、64bitのdouble precisionを二つ並べたものである(cf. Baily,
Hida et al; QD lib.)。従って、double-doubleのアプローチと呼ばれたりすることもある。確かに
コンパイラのマニュアルには、「1 つの 128 ビットの長倍精度数は、1 組の順序付きの 64 ビット倍精度数で構成されます。順序付きペアの最初のメンバーにはその数の上位部分が入り、2 番目のメンバーには下位部分が入っています。長倍精度の数量の値は、2 つの 64 ビット数の合計です」と書かれている。
このアプローチはdoubleの演算ですべて事足りるので、多倍長精度計算を行わず、手軽にソフトウェアだけで実現可能である。そしてソフトウェアエミュレーションよりは高速だと考えられている。しかし、いまいちサポートされている環境は少ない。知る限り、RS6000系のgccやAppleのMacOSX PowerPC版のみでこれをサポートしている。おそらくAIX上での互換性を保つため、前者はサポートし、後者はgccをサポートしたのでそれに引きずられるようにサポートしたのであろう。
ソースコードを見てみよう。前者について、
darwin-ldouble.cがわかりやすく、
後者について、
libmのソースコードが入手できる。
見れば解るとおり、陽にdouble-doubleのアプローチでの擬似四倍精度であることがわかる。尚、Intel Macには、long doubleについて、そのようなソースコードの痕跡はない。高速かはどうかは計測していない。
もし、他プラットフォームで使いたいのであれば、
HidaらのQDライブラリを使うべきであろう。我が
MPACKも使っている。規格にしてしまえ、というのは有るのかもしれないが、これについては多くが否定的である。また今度述べることにする。