0

我正在学习如何使用 Boost Multiprecision Library。作为练习,在遵循以下分布构造示例之后,我能够使用库的内置高精度十进制浮点表示成功实现一个以高精度计算负二项式 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 后端。正如我从这里理解的那样,只需包含正确的gmp.hpp并使用正确的 GMP 浮点类型而不是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。

4

0 回答 0