如何以任意精度定义函数 (Eigen/MPRealSupport)

How to define function with arbitrary precision (Eigen/MPRealSupport)

如何用typedef定义Matrix<mpreal, Dynamic, Dynamic>

我们通常将定义的类型放在头文件中,但它需要mpreal::set_default_prec(256);,这就是问题所在。

我是 MPFR 的新手,如果看起来容易,我深表歉意。 那么你的想法是什么?

#include <Eigen/LU>
#include <iostream>
#include <Eigen/Dense>
#include "mylibrary.hpp"
#include <unsupported/Eigen/MPRealSupport>

using namespace mpfr;
using namespace Eigen;


MatrixXmp hilbert_matrix(const int size)
{
    MatrixXmp A = MatrixXmp::Zero(size, size);
    for (int i = 1; i < size + 1; ++i)
        for (int j = 1; j < size + 1; ++j)
            A(i - 1, j - 1) = 1. / (i + j - 1.);

    return A;
}


int main()
{
    // set precision to 256 bits (double has only 53 bits)

    mpreal::set_default_prec(256);
    typedef Matrix<mpreal, Dynamic, Dynamic> MatrixXmp;
    typedef Matrix<mpreal, Dynamic, 1> VectorXmp;
    

    return 0;
}

错误:

‘MatrixXmp’ does not name a type

mpreal(注意,它位于一个命名空间mpfr里面)是一个class和set_default_prec is a static method。这意味着设置精度对模板参数没有影响,因此对 typedef 也没有影响。调用 static 函数只会在内部更改默认精度,而不会影响模板。

  • 您可以 typedef 在您的 header 内的主要外部,然后才 在调用它的程序main中设置精度。

     using MatrixXmp = Matrix<mpfr::mpreal, Dynamic, Dynamic>;
     using VectorXmp = Matrix<mpfr::mpreal, Dynamic, 1>;
    
     int main() {
       mpfr::mpreal::set_default_prec(256);
       return EXIT_SUCCESS;
     }
    
  • 或者有一个构造函数

    mpreal(const mpz_t u, mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());
    

    这意味着您实际上可以 添加一个 mp_prec_t prec 作为函数的(模板)参数,并将其默认为 256。然后在构造任何类型的 mpfr::mpreal 时,将精度和舍入策略作为第二和第三个参数传递给构造函数。