MPFR:得到mpf_class的罪

时间:2014-11-14 19:11:20

标签: gmp sin mpfr

我在我的环境中安装了gmp和mpfr。现在我可以成功

#include <gmpxx.h>
#include <mpfr.h>
#include <mpf2mpfr.h>

现在,假设我用一些值初始化一个mpf_class:

mpf_class x = 0.73;

我如何使用mpfr来获得这个数字的罪?我只需要一个mpf_class,一个mpf_class。类似的东西:

mpf_class y = sin(x)

这显然不起作用。我注意到有一个mpfr_sin函数,我这样称呼它:

mpfr_sin(x, y, MPFR_RNDN);

但这并没有奏效。那我该怎么办?我做错了吗?

谢谢

1 个答案:

答案 0 :(得分:1)

mpf2mpfr.h可能不是你想要的。它包含大量的#define来替换mpf名称和随后的所有内容中的mpfr名称。如果您希望有机会在您的情况下使用它,则必须在mpf2mpfr.h之前加入gmpxx.h。但是,该文件不会翻译所有内容。以下内容允许它在C ++ 03中编译(只要你不转换为mpq_class):

#include <mpfr.h>
#include <mpf2mpfr.h>
void mpfr_get_q (mpq_ptr, mpfr_srcptr);
#undef mpq_set_f
#define mpq_set_f(x,y) mpfr_get_q(x,y)
#include <gmpxx.h>

int main(){
  mpf_class x=.73;
  mpf_class y;
  mpfr_sin(y.get_mpf_t(),x.get_mpf_t(),MPFR_RNDN);
} 

但是尝试使用operator<<打印将打印指针而不是数字,例如。 C ++ 11中提供的额外功能需要进行更多调整,在包含#define __GMPXX_USE_CXX11 0之前更容易禁用它们:gmpxx.h

解决此问题的方法主要有两种,都是从删除mpf2mpfr.h开始。第一个是创建临时mpfr_t

mpf_class x=.73;
mpf_class y;
mpfr_t xx;
mpfr_t yy;
mpfr_init_set_f(xx, x.get_mpf_t(), MPFR_RNDN);
mpfr_init(yy);
mpfr_sin(yy, xx, MPFR_RNDN);
mpfr_get_f(y.get_mpf_t(), yy, MPFR_RNDN);

第二个是完全放弃mpf并仅使用mpfr。它的webpage为它列出了6个C ++包装器,其中一些仍在维护。