Boost.Multiprecision 多倍長浮動小数点数

多倍長演算ライブラリであるBoost.Multiprecisionには、多倍長整数の他に、多倍長浮動小数点数が用意されています。
これは、以下のように使用します。

#include <iostream>
#include <boost/multiprecision/cpp_dec_float.hpp>

namespace mp = boost::multiprecision;

int main()
{
    // 100は仮数部の桁数
    mp::cpp_dec_float_100 x = 2.0f;

    // 平方根を100桁求める
    mp::cpp_dec_float_100 result = mp::sqrt(x);

    // 出力桁数を設定して出力
    std::cout << std::setprecision(std::numeric_limits<decltype(x)>::digits10 + 1)
              << result;
}
1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727

ここでは、100桁の仮数部をもつ浮動小数点数型であるcpp_dec_float_100を使用していますが、この仮数部桁数は、自分で指定することもできます。cpp_dec_float_100の定義は、以下のようになっています:

namespace boost{ namespace multiprecision{

template <unsigned Digits10, class ExponentType = boost::int32_t, class Allocator = void>
class cpp_dec_float;

typedef number<cpp_dec_float<50> > cpp_dec_float_50;
typedef number<cpp_dec_float<100> > cpp_dec_float_100;

}}

50桁と100桁が事前定義されています。自分で桁数を指定したい場合は、number >のように指定します。
cpp_dec_floatの第1テンプレートパラメータ以外はデフォルト引数になっていますが、それぞれの意味は以下のようになります:

  • ExponentType : 指数部に使用する符号付き整数型
  • Allocator : アロケータ型。voidを指定した場合は内部的に静的な固定長配列が使用され、フリーストアを使用しない。アロケータに渡される型は、boost::uint32_t。

アロケータ指定の動的メモリ割り当ては、パフォーマンスを犠牲にしてより大きなデータを扱うために用意されていますが、Boost 1.53.0現在では、14,368桁までの静的なサイズ制限があります。


参照:
cpp_dec_float - Boost Multiprecision Library
Boost.Multiprecision で桁あふれしない階乗と円周率 1 万桁 - Siv3D 開発ブログ