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

问题描述

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

我们通常将定义的类型放在头文件中,但它需要 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> MatrixXmp;
    typedef Matrix<mpreal,1> VectorXmp;
    

    return 0;
}

错误:

‘MatrixXmp’ does not name a type

解决方法

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

  • 您可以typedef在您的标题内的主要内容之外,然后才main内设置精度调用它的程序

     using MatrixXmp = Matrix<mpfr::mpreal,Dynamic,Dynamic>;
     using VectorXmp = Matrix<mpfr::mpreal,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 时,将精度和舍入策略作为第二个和第三个参数传递给构造函数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...