Next: , Previous: , Up: C++ Class Interface   [Index]


12.4 C++浮動小数点数クラス

f=g*h+x*yのように,mpf_classクラスの一時中間変数を必要とする式の場合,これらの変数は最終結果を格納するfと同じ精度になります。この挙動が相応しくないときには,明示的にコンストラクタを呼び出して下さい。

Function: mpf_class::mpf_class (type op)
Function: mpf_class::mpf_class (type op, mp_bitcnt_t prec)

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
Function: explicit mpf_class::mpf_class (const mpf_t f)
Function: mpf_class::mpf_class (const mpf_t f, mp_bitcnt_t prec)

mpf_t変数を利用したmpf_classコンストラクタです。fの値が新規生成されたmpf_class変数にコピーされ,一切の参照関係は生じません。

precが与えられていると,値の初期精度(ビット)となります。与えられていない場合は,初期精度はfの精度になります。

Function: explicit mpf_class::mpf_class (const char *s)
Function: mpf_class::mpf_class (const char *s, mp_bitcnt_t prec, int base = 0)
Function: explicit mpf_class::mpf_class (const string& s)
Function: mpf_class::mpf_class (const string& s, mp_bitcnt_t prec, int base = 0)

mpf_set_str関数を使って文字列を変換してmpf_class型にセットするコンストラクタです(see Assigning Floats)。precが与えられていれば,値の初期精度(ビット)となります。与えられていなければデフォルトのmpf精度(see Initializing Floats)が使われます。

文字列が正常な浮動小数点数でない場合はstd::invalid_argument例外が発生します。operator=でも同様です。

Function: mpf_class operator"" _mpf (const char *str)

C++11コンパイラを使うと,浮動小数点数は 1.23e-1_mpf文法で生成されます。これはmpf_class("1.23e-1")と同義です。

Function: mpf_class& mpf_class::operator= (type op)

与えられた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は標準の浮動小数点データ型を使うことしか想定されていませんが,同精度計算,異精度計算,どちらにも対応した実装が行われています(訳注:そうなの?)

Function: mpf_class abs (mpf_class op)
Function: mpf_class ceil (mpf_class op)
Function: int cmp (mpf_class op1, type op2)
Function: int cmp (type op1, mpf_class op2)
Function: bool mpf_class::fits_sint_p (void)
Function: bool mpf_class::fits_slong_p (void)
Function: bool mpf_class::fits_sshort_p (void)
Function: bool mpf_class::fits_uint_p (void)
Function: bool mpf_class::fits_ulong_p (void)
Function: bool mpf_class::fits_ushort_p (void)
Function: mpf_class floor (mpf_class op)
Function: mpf_class hypot (mpf_class op1, mpf_class op2)
Function: double mpf_class::get_d (void)
Function: long mpf_class::get_si (void)
Function: string mpf_class::get_str (mp_exp_t& exp, int base = 10, size_t digits = 0)
Function: unsigned long mpf_class::get_ui (void)
Function: int mpf_class::set_str (const char *str, int base)
Function: int mpf_class::set_str (const string& str, int base)
Function: int sgn (mpf_class op)
Function: mpf_class sqrt (mpf_class op)
Function: void mpf_class::swap (mpf_class& op)
Function: void swap (mpf_class& op1, mpf_class& op2)
Function: mpf_class trunc (mpf_class op)

これらの関数群はGMPのCルーチンへのC++インターフェースを提供します。

cmp関数はlong longlong doubleを除く,全ての標準C++データ型の比較に利用できます。

hypot関数を実行した結果の精度については現在は保証されていません(訳注:精度保証が欲しければMPFRのmpfr_hypot関数を使いましょう。)。

Function: mp_bitcnt_t mpf_class::get_prec ()
Function: void mpf_class::set_prec (mp_bitcnt_t prec)
Function: void mpf_class::set_prec_raw (mp_bitcnt_t prec)

mpf_classクラスの現段階でのデフォルト精度をセットしたり入手したりできます。

mpf_set_prec_raw関数で述べた制限 (see Initializing Floats)はこのmpf_class::set_prec_raw関数にも当てはまります。特に mpf_classに対しては,破棄される前に割り当てられた精度で格納されます。この操作はアプリケーション側で実施されるべきものなので,自動的に行う機構は用意していません。


Next: , Previous: , Up: C++ Class Interface   [Index]