我在我的环境中安装了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);
但这并没有奏效。那我该怎么办?我做错了吗?
谢谢
答案 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 ++包装器,其中一些仍在维护。