Boost Multiprecision Library の使い方を学んでいます。演習として、次のDistribution Construction Exampleに従った後、ライブラリの組み込みの高精度小数浮動小数点表現を使用して、高精度で負の二項 PDF を計算する関数を正常に実装することができましたcpp_def_float
。
#include <iostream>
#include <boost/math/distributions/negative_binomial.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
using namespace std;
using namespace boost;
typedef boost::multiprecision::cpp_dec_float_50 myPrecision;
template <class T1, class T2>
myPrecision negbinPDF(T1 passed_val, T2 passed_par1, T2 passed_par2)
{
myPrecision val = myPrecision(passed_val);
myPrecision par1 = myPrecision(passed_par1);
myPrecision par2 = myPrecision(passed_par2);
return math::pdf(math::negative_binomial_distribution<myPrecision>(par1, par2), val);
};
int main()
{
auto p = negbinPDF(1.23456789012345678901234567890, 8.0, 0.25);
cout << "The PDF is: " << p << endl;
}
期待どおりに動作し、次の出力が出力されます。
The PDF is: 0.0001263
ただし、上記のコードを GMP バックエンドを使用するように変更したいと考えています。hereから理解したように、適切な を含めて、gmp.hpp
適切な GMP float 型を使用するだけcpp_def_flota
です。次のように:
#include <iostream>
#include <boost/math/distributions/negative_binomial.hpp>
#include <boost/multiprecision/gmp.hpp>
using namespace std;
using namespace boost;
typedef boost::multiprecision::number<boost::multiprecision::gmp_float<50>> myPrecision;
// typedef boost::multiprecision::mpf_float_50 myPrecision; // this also raises the errors
template <class T1, class T2>
myPrecision negbinPDF(T1 passed_val, T2 passed_par1, T2 passed_par2)
{
myPrecision val = myPrecision(passed_val);
myPrecision par1 = myPrecision(passed_par1);
myPrecision par2 = myPrecision(passed_par2);
return math::pdf(math::negative_binomial_distribution<myPrecision>(par1, par2), val);
};
int main()
{
auto p = negbinPDF(1.23456789012345678901234567890, 8.0, 0.25);
cout << "The PDF is: " << p << endl;
}
それでも、これは機能せず、次のコンパイル エラーが発生します (ここでは最初にいくつかのエラーのみを表示します。後で完全なエラー ログにリンクします)。
/tmp/cc6JpzDu.o: In function `boost::multiprecision::backends::detail::gmp_float_imp<50u>::~gmp_float_imp()':
to_ask_at_SO.cpp:(.text._ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EED2Ev[_ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EED5Ev]+0x21): undefined reference to `__gmpf_clear'
/tmp/cc6JpzDu.o: In function `boost::multiprecision::backends::gmp_float<50u>::gmp_float()':
to_ask_at_SO.cpp:(.text._ZN5boost14multiprecision8backends9gmp_floatILj50EEC2Ev[_ZN5boost14multiprecision8backends9gmp_floatILj50EEC5Ev]+0x31): undefined reference to `__gmpf_init2'
/tmp/cc6JpzDu.o: In function `boost::multiprecision::backends::detail::gmp_float_imp<50u>::str[abi:cxx11](long, std::_Ios_Fmtflags) const':
to_ask_at_SO.cpp:(.text._ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags[_ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags]+0xbe): undefined reference to `__gmp_get_memory_functions'
to_ask_at_SO.cpp:(.text._ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags[_ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags]+0x132): undefined reference to `__gmpf_get_str'
to_ask_at_SO.cpp:(.text._ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags[_ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags]+0x1b3): undefined reference to `__gmpf_get_str'
to_ask_at_SO.cpp:(.text._ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags[_ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags]+0x30f): undefined reference to `__gmpf_get_str'
to_ask_at_SO.cpp:(.text._ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags[_ZNK5boost14multiprecision8backends6detail13gmp_float_impILj50EE3strB5cxx11ElSt13_Ios_Fmtflags]+0x343): undefined reference to `__gmpf_get_str'
/tmp/cc6JpzDu.o: In function `boost::multiprecision::backends::detail::gmp_float_imp<50u>::operator=(double)':
to_ask_at_SO.cpp:(.text._ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EEaSEd[_ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EEaSEd]+0x36): undefined reference to `__gmpf_init2'
to_ask_at_SO.cpp:(.text._ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EEaSEd[_ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EEaSEd]+0x4f): undefined reference to `__gmpf_set_d'
/tmp/cc6JpzDu.o: In function `boost::multiprecision::backends::detail::gmp_float_imp<50u>::gmp_float_imp(boost::multiprecision::backends::detail::gmp_float_imp<50u> const&)':
to_ask_at_SO.cpp:(.text._ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EEC2ERKS4_[_ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EEC5ERKS4_]+0x28): undefined reference to `__gmpf_init2'
to_ask_at_SO.cpp:(.text._ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EEC2ERKS4_[_ZN5boost14multiprecision8backends6detail13gmp_float_impILj50EEC5ERKS4_]+0x48): undefined reference to `__gmpf_set'
完全なエラー ログは、ここで確認できます。
私の質問は、私が間違っていることです.GMPバックエンドを使用してこれを機能させるにはどうすればよいですか? それが役立つ場合、私は64ビットのUbuntu 18.04インストールでVisual Codeを使用しています。