问题描述
如何用 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
时,将精度和舍入策略作为第二个和第三个参数传递给构造函数。