如何以任意精度定义函数 (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
时,将精度和舍入策略作为第二和第三个参数传递给构造函数。
如何用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
时,将精度和舍入策略作为第二和第三个参数传递给构造函数。