背景
- 高精度な数値計算が必要
- C++ でやりたい(Fotran は使わない)
- Windows, macOS, Linux などクロスプラットホームで動く
- 速度はそんなに気にしない.
- ついでに Android/iOS でも動けば会計アプリとか作れてよい.
- 自前アプリに組み込みたいので, non GPL なのがほしい
- LGPL は OK ではあるが, できれば BSD, MIT な感じのがほしい
MPFR, gmp
各所で使われているライブラリです. LGPL なのと, 古きつらき configure しか無いのと Windows でぺろっとビルドできない(頑張ればできるだろうがめんどい)のが欠点です.
ARPREC
modified BSD ライセンスです. これも古きつらき configure ですが, コードはポータブルっぽいので CMake とかで *.cc
追加すればビルドできそうな雰囲気あります.
どの程度開発が続いているのかは不明です.
ARPREC を自前アプリに組み込んで配布したい場合は, License agreement を結ぶ必要がありそうです.
mpdecimal
十進多倍長演算ライブラリです.
10 進は, 主にお金の計算とかに有用かと思いますが, 10 進数値データを読み書きして計算とかにも役立ちそうです(e.g. CSV 数値データとか)
Python 3.3 からの decimal module のベースとなっています.
したがって C/C++ 版も Python decimal module と概ね同じふるまいをするのが期待されます.
ライセンスは simplified BSD です.
libbf
2進(IEEE754)と 10 進の両方をサポートしています.
embed しやすいです(ファイル数は 4 個). MIT ライセンスでよい.
ただ, ユーティリティ関数のコード(cutils.h, cutils.c)は gcc 拡張が使われているので, MSVC ですと少し改修がいります.
ベンチマーク
ns/limb なので値が低いほうが高速... のはずです.
100 ~ 500 桁くらいですと, MPFR は x1.5 ~ x2.0 程度の高速化にとどまります.
(Threadripper 1950X で計測. AVX2 有効. AVX2 off だと 10~20% 遅くなる感じ)
桁が小さい時に MPFR が早いのはなにか ASM or SIMD とかで最適化しているのですかね.
桁が大きくなると, MPRT では FFT で高速化しているからか開きは大きくなります.
QD
10 進で 100 桁くらいだと QD のほうが性能よいらしい.
(ARPREC と同じところ)
こちらもライセンスは, 独自の修正 BSD.
GPU で高速化?
ちょっと古いですが gpuprec ありました.
まとめ
C++ で自前アプリに embed したいですと libbf, mpdecimal が候補でしょうか.
その他
mpfr のサイトにまとまっています.
参考文献
- 多倍長精度数値計算 GNU MP,MPFR,QDによるプログラミング
TODO
- 自前でナウでヤングな多倍長演算ライブラリを作る(Cmake 対応).