最終更新: 2014/8/1

MPFRラッパー

柏木 雅英

1. はじめに

MPFRは、 The GNU MPFR Library にある非常に有名な高精度浮動小数点計算ライブラリである。 これ自身はC言語インターフェースを持つライブラリだが、 いくつかC++で使うためのラッパーの実装も存在する。

特にKVライブラリのintervalと組み合わせて使うために、簡単な ラッパーを実装した。例えば106bitの浮動小数点数を使いたいなら、 kv::mpfr<106>という型を使えばよい。 本来のmpfrは混合精度の計算が可能だが、本ラッパーはtemplate parameterで 精度を一律に固定してしまう簡易的なものである。

doubleに対するrdouble.hpp, dd.hppに対するrdd.hppと同様に、 方向付き丸めのためのrmpfr.hppも作成した。 mpfr.hppと併せて使用すると、高精度区間演算を実現できる。

2. ファイル構成

mpfr.hpp
(下請け: convert.hpp)
rmpfr.hpp

3. 使い方

test-mpfr.hppを見てください。 区間の両端に使って高精度区間演算を行う例は、test-impfr.hppを見てください。

コンパイル時には、必要ならば-Iや-Lでmpfrのheaderやlibraryの在処を 指定し、-lmpfrが必要。

また、mpfr本体はおそらくversion 3.1以上が必要。

4. おわりに

mpfrは数学関数の方向付き丸めが可能だが、intervalの端点として mpfrを使った場合、数学関数はinterval.hppの中にある実装が用いられて mpfrの数学関数は使われない。interval.hppが加減乗除と平方根の 方向付き丸めが可能であるような全ての型に対して区間演算を行えるように 設計されているためである。

まだ十分テストされていない。

あるマシン (core i7 4600U) である全解探索問題 (5つの解を持つ 非線形回路方程式) を解いたときの計算時間を示す。

使った型 計算時間 コンパイルオプション
double 5.96sec -DKV_FASTROUND -DNDEBUG -O3
dd 29.9sec -DKV_FASTROUND -DNDEBUG -O3
mpfr<53> 326sec -DNDEBUG -O3
mpfr<106> 415sec -DNDEBUG -O3

これを見ると、53bit(doubleと同じ精度)や106bit(ddと同じ精度)では あまり使う意味が無いことが分かる。ddより更に高い精度がどうしても 必要な場合に仕方なく、といった使い方になると思われる。