3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C/C++ 多倍長(高精度)演算ライブラリのメモ

Last updated at Posted at 2020-08-29

背景

  • 高精度な数値計算が必要
  • 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 ですと少し改修がいります.

ベンチマーク

Screenshot from 2020-08-29 15-11-05.png

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 のサイトにまとまっています.

参考文献

TODO

  • 自前でナウでヤングな多倍長演算ライブラリを作る(Cmake 対応).
3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?