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


12.3 C++有理数クラス

本節の全てのコンストラクタは,有理数が与えられると,mpq_class::canonicalize関数を呼び出さなくても必ず標準形に変換されます。

Function: mpq_class::mpq_class (type op)
Function: mpq_class::mpq_class (integer num, integer den)

mpq_classコンストラクタです。初期値が何らかのクラスの単独の値でも,有理数を表現する整数(mpz_classかC++標準整数)の組でも受け付けます(mpf_classからの変換は明示的に行う必要あり)。但し,long longlong double は受け付けません。下記のように使用できます。

mpq_class q (99);
mpq_class q (1.75);
mpq_class q (1, 3);
Function: explicit mpq_class::mpq_class (const mpq_t q)

mpq_t型を利用したmpq_classコンストラクタです。一切の後腐れなく,qの値が新しいmpq_classにコピーされます。

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

mpq_set_str関数を用いた,文字列を変換して初期値として使うmpq_classコンストラクタです。(see Initializing Rationals)

文字列が正常な有理数でない場合はstd::invalid_argument例外が発生します。operator=演算子でも同様です。

Function: mpq_class operator"" _mpq (const char *str)

C++11コンパイラを使うと,有理数は123_mpq文法と等価になります。これはmpq_class(123_mpz)と同じです。他の有理数は-1_mpq/2もしくは0xb_mpq/123456_mpzのように構築することができます。

Function: void mpq_class::canonicalize ()

mpq_classクラスを標準形に直します(Rational Number Functions参照)。すべての演算子は標準形のオペランドを要求し,演算結果も標準形にします。

Function: mpq_class abs (mpq_class op)
Function: int cmp (mpq_class op1, type op2)
Function: int cmp (type op1, mpq_class op2)
Function: double mpq_class::get_d (void)
Function: string mpq_class::get_str (int base = 10)
Function: int mpq_class::set_str (const char *str, int base)
Function: int mpq_class::set_str (const string& str, int base)
Function: int sgn (mpq_class op)
Function: void mpq_class::swap (mpq_class& op)
Function: void swap (mpq_class& op1, mpq_class& op2)

これらの関数はGMP C関数に対するC++クラスインターフェースを提供します。

cmp関数は,全てのクラスと,long long型とlong double型を除く標準C++データ型に対して比較を行います。

Function: mpz_class& mpq_class::get_num ()
Function: mpz_class& mpq_class::get_den ()

mpq_classの分子と分母へのmpz_class参照を返します。読み書きのどちらにも使用できます。返される参照のオブジェクトが変更されると,元のmpq_classsも変更されます。

分子分母を直接操作して標準形から外れた値にしてしまった場合は,mpq_class::canonicalizeを呼び出して以降の演算に影響がないようにして下さい。

Function: mpz_t mpq_class::get_num_mpz_t ()
Function: mpz_t mpq_class::get_den_mpz_t ()

mpq_classを構成するmpz_t型の分子と分母への参照を返します。これを使うとmpz_tを引数とするC関数に値を渡せます。これらのmpz_t参照先を変更すると,元のmpq_classも変更されます。

直接操作した結果,標準形から外れた値になった時には,以降の操作に影響がないよう,mpq_class::canonicalize関数を呼び出すようにして下さい。

Function: istream& operator>> (istream& stream, mpq_class& rop);

streamからropios形式で読み取ります。mpq_t operator>>と同じです (see C++ Formatted Input)。

ropが標準形でない場合はmpq_class::canonicalizeを呼び出しておく必要があります。