Next: , Previous: , Up: Floating-point Functions   [Index]


7.1 初期化関数

Function: void mpf_set_default_prec (mp_bitcnt_t prec)

最小でもprec bit確保すべく,デフォルト精度をセットします。この関数を実行して以降の mpf_init関数は,このデフォルト精度が使用されます。それ以前に初期化された変数は影響ありません。

Function: mp_bitcnt_t mpf_get_default_prec (void)

現在使用されているデフォルト精度を返します。

mpf_tオブジェクトは,値を最初に格納する前に初期化されている必要があります。mpf_init関数やmpf_init2関数を使って初期化して下さい。

Function: void mpf_init (mpf_t x)

変数xを初期化してゼロを格納します。通常は,変数の初期化と,mpf_clear関数を使った解放は一度だけ行うようにして下さい。xの精度は,mpf_set_default_prec関数でデフォルト精度がセットされていない限り,定義されません。

Function: void mpf_init2 (mpf_t x, mp_bitcnt_t prec)

変数xを初期化してゼロを格納し,精度をprec bitに設定します。通常は,変数の初期化と,mpf_clear関数を使った解放は一度だけ行うようにして下さい。

Function: void mpf_inits (mpf_t x, ...)

NULL終端子を持ったmpf_t変数の列を初期化し,すべてにゼロをセットします。初期化された変数リストの精度は,mpf_set_default_prec関数でデフォルト精度が設定されていない限り不定となります。

Function: void mpf_clear (mpf_t x)

xが確保していたメモリスペースを解放します。 使用してたmpf_t型変数すべてに対してこの関数で解放したか,しっかり確認して下さい。

Function: void mpf_clears (mpf_t x, ...)

NULL終端子付きのmpf_t型変数リストが確保していたメモリスペースを全て解放します。

下記は,浮動小数点変数を初期化するサンプルプログラムです。

{
  mpf_t x, y;
  mpf_init (x);           /* デフォルト精度を使う */
  mpf_init2 (y, 256);     /* 精度は最小でも 256 bit */
  …
  /* プログラムが中断されなければここを実行 ... */
  mpf_clear (x);
  mpf_clear (y);
}

以降の関数は,計算中に使用する精度を変更するために利用できます。良くある使用例としては,Newton-Raphon反復中の精度の調整や,有効桁数に合わせた計算精度の変更があります。

Function: mp_bitcnt_t mpf_get_prec (const mpf_t op)

opの現在の精度桁をbit数で返します。

Function: void mpf_set_prec (mpf_t rop, mp_bitcnt_t prec)

ropの精度をprec bitにセットします。ropに入っていた値は新しい精度に切り捨てられます。

この関数はrealloc関数を使って実装されていますので,あまり繰り返し使わないで下さい。

Function: void mpf_set_prec_raw (mpf_t rop, mp_bitcnt_t prec)

ropの精度を prec bitにセットします。既に確保されたメモリはそのまま使用します。

precは,ropの精度,即ち初期化時の精度やmpf_set_precで設定した精度より大きくしてはいけません。

ropの値は変化せずに保持されます。prec bit以上の精度を持っていた時には,有効桁数の高い方が保持されます。新しい値はropに書きこまれ,prec bitの精度になります。

mpf_clear関数やmpf_set_prec関数を呼び出す前であれば, mpf_set_prec_raw関数を呼び出して,元の精度でropに書き戻さなくてはなりません。これが失敗すると何が起こるかわかりません。

mpf_set_prec_raw関数を呼び出す前であれば,mpf_get_prec関数で元の精度を取り出すことができます。呼び出し後だと,prec精度の値になってしまいます。

mpf_set_prec_raw関数は,計算の途中でもmpf_t型変数の精度を素早く変更することができ,ループの中で精度を増やしたり,計算中に別の目的で様々な精度を設定したりするときに有用です。