3

boost::multiprecisionのドキュメントから読みました:

数値の型に応じて、精度は任意に大きく (使用可能なメモリによってのみ制限される)、コンパイル時に固定される (たとえば、10 進数で 50 桁または 100 桁)、またはメンバー関数によって実行時に制御される変数になります。単純なユーザー定義型よりも優れたパフォーマンスを得るために、これらの型は式テンプレート対応です。

さらにドキュメントを読みましたが、実行時の精度の変更に関するものは何も見つかりませんでした。コンパイル時に精度を設定できるテンプレートしか見たことがありませんが、それは私が望んでいるものではありません (非常に高い倍率を使用してフラクタルをズームするプログラムを作成したい)。

実行時に精度を変更できる double 型を作成するにはどうすればよいですか?

4

1 に答える 1

3

number バックエンドのほとんどは、オプションでのみ固定容量を持っています。

また、一部のバックエンド (特に cpp のもの) はアロケーターを使用するため、必要に応じて/暗黙的に/成長します (指定された制限まで):

通常cpp_bin_floatはメモリを割り当てません。数字に必要なすべてのスペースは、クラス内で直接割り当てられます。その結果、スタック領域の要件が制御不能になる可能性があるため、桁数が多すぎるクラスを使用しないように注意する必要があります。それが問題を表している場合、アロケーターをテンプレートパラメーターとして提供すると、cpp_bin_float必要なメモリが動的に割り当てられます

最も人気のあるバックエンドのドキュメントを確認してみましょう。

  • gmpmpf_floatはこれに準拠しています:

    typedef number<gmp_float<0> >     mpf_float;
    

    タイプ gmp_float は、ゼロ以外の Digits10 テンプレート パラメーターを指定することによって固定精度で使用することも、テンプレート引数をゼロに設定することによって可変精度で使用することもできます。

    typedef mpf_float数値メンバー関数を介して精度を制御できる可変精度型を提供します。

  • MPFR バックエンドについても同様です。

    タイプmpfr_float_backendは、ゼロ以外の Digits10 テンプレート パラメーターを指定して固定精度で使用するか、テンプレート引数をゼロに設定して可変精度で使用できます。

    typedef mpfr_float は、数値メンバー関数を介して精度を制御できる可変精度型を提供します。

動的精度の使用例:

// Operations at variable precision and no numeric_limits support:
mpfr_float a = 2;
mpfr_float::default_precision(1000);
std::cout << mpfr_float::default_precision() << std::endl;
std::cout << sqrt(a) << std::endl; // print root-2

numeric_limits未定義のままになります

于 2015-11-21T22:57:17.517 に答える