3

自分の環境に gmp と mpfr をインストールしました。今、私は成功することができます

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

ここで、mpf_class を何らかの値で初期化するとします。

mpf_class x = 0.73;

mpfr を使用してこの数値の sin を取得するにはどうすればよいですか? mpf_class in と mpf_class out だけが必要です。何かのようなもの:

mpf_class y = sin(x)

これは明らかに機能しません。次のように呼び出した mpfr_sin 関数があることに気付きました。

mpfr_sin(x, y, MPFR_RNDN);

しかし、それもうまくいきませんでした。それで、私は何をすべきですか?私は何か間違ったことをしていますか?

ありがとうございました

4

1 に答える 1

2

mpf2mpfr.hおそらくあなたが望むものではありません。これには#define、以降のすべてで mpf 名を mpfr 名に置き換えるための多くの情報が含まれています。あなたのケースでそれが機能する可能性が必要な場合は、mpf2mpfr.hbeforeを含める必要があります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

これを解決するには主に 2 つの方法があり、どちらも を削除することから始め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);

2 つ目は、mpf を完全に削除して mpfr のみを使用することです。そのWeb ページには 6 つの C++ ラッパーがリストされており、そのうちのいくつかはまだ維持されています。

于 2014-11-16T08:16:21.883 に答える