多倍長演算ライブラリである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 開発ブログ