Next: C++ Interface Random Numbers, Previous: C++ Interface Rationals, Up: C++ Class Interface [Index]
f=g*h+x*y
のように,mpf_class
クラスの一時中間変数を必要とする式の場合,これらの変数は最終結果を格納するf
と同じ精度になります。この挙動が相応しくないときには,明示的にコンストラクタを呼び出して下さい。
mpf_class
コンストラクタです。long long
型とlong double
型を除くすべての標準C++データ型を利用できます。
precが与えられると,初期精度bitがこの値でセットされます。
precがセットされていないと,初期精度はopによって規定されます。mpz_class
, mpq_class
, C++標準のデータ型の場合はデフォルトのmpf
精度が使用されます(see Initializing Floats)。mpf_class
や式の場合は,その変数の精度が適用されます。2項から成る式の精度は,大きい方の精度が適用されます。
mpf_class f(1.5); // default precision mpf_class f(1.5, 500); // 500 bits (at least) mpf_class f(x); // precision of x mpf_class f(abs(x)); // precision of x mpf_class f(-g, 1000); // 1000 bits (at least) mpf_class f(x+y); // greater of precisions of x and y
mpf_t
変数を利用したmpf_class
コンストラクタです。fの値が新規生成されたmpf_class
変数にコピーされ,一切の参照関係は生じません。
precが与えられていると,値の初期精度(ビット)となります。与えられていない場合は,初期精度はfの精度になります。
mpf_set_str
関数を使って文字列を変換してmpf_class
型にセットするコンストラクタです(see Assigning Floats)。precが与えられていれば,値の初期精度(ビット)となります。与えられていなければデフォルトのmpf
精度(see Initializing Floats)が使われます。
文字列が正常な浮動小数点数でない場合はstd::invalid_argument
例外が発生します。operator=
でも同様です。
C++11コンパイラを使うと,浮動小数点数は
1.23e-1_mpf
文法で生成されます。これはmpf_class("1.23e-1")
と同義です。
与えられたopの値をmpf_class
に変換してセットします。前述のコンストラクタ同様に,同じデータ型であればそのまま利用できます。
operator=
は値を代入するだけで,元の変数の精度をコピーすることはなく,必要に応じて切り捨ても実行します。これはmpf_set
関数等の代入関数と同様です。特に,
mpf_class
クラスのコピーを行うコンストラクタは,デフォルトのコンストラクタや割り当て関数とは異なる動作になります。
mpf_class x (y); // xはyと同じ精度で生成 mpf_class x; // x はデフォルトの精度で生成 x = y; // yの値はxの精度に切り捨てられる
テンプレート化したプログラムを使うアプリケーションは,多様な精度を持つmpf_class
変数を使う計算部において,何が行われるかということに留意する必要があります。例えば,標準の複素数テンプレートcomplex
は標準の浮動小数点データ型を使うことしか想定されていませんが,同精度計算,異精度計算,どちらにも対応した実装が行われています(訳注:そうなの?)
これらの関数群はGMPのCルーチンへのC++インターフェースを提供します。
cmp
関数はlong long
とlong double
を除く,全ての標準C++データ型の比較に利用できます。
hypot
関数を実行した結果の精度については現在は保証されていません(訳注:精度保証が欲しければMPFRのmpfr_hypot関数を使いましょう。)。
mpf_class
クラスの現段階でのデフォルト精度をセットしたり入手したりできます。
mpf_set_prec_raw
関数で述べた制限 (see Initializing Floats)はこのmpf_class::set_prec_raw
関数にも当てはまります。特に
mpf_class
に対しては,破棄される前に割り当てられた精度で格納されます。この操作はアプリケーション側で実施されるべきものなので,自動的に行う機構は用意していません。
Next: C++ Interface Random Numbers, Previous: C++ Interface Rationals, Up: C++ Class Interface [Index]