ぺんぎんさんのおうち

日記です。たまに日記じゃないこともあります。

mpf_classの精度を設定したいとき

わかってない部分が多すぎる. mpf_classはコンストラクタの中でmpf_set_precを使って精度を設定してるのだと思っていたが,どうやらそうではないらしい.mpf_init2を呼んでるっぽい.
流れとしては init2, __gmp_set_expr(mpf_ptr f, const __gmp_expr<mpq_t, T> &expr)

mpf_class, mpt_tを使うとき,扱う浮動小数点の精度を与えることができる. 精度というのは,「対象の値(たとえば1/17とか)を,どれだけのビット数を使って表現するか」のことである.

話をmpf_classに絞ることにする(mpf_tでもあんまり変わらん).
次のようなコードを与える.

#include <iostream>
#include <gmpxx.h>

int main() {
    mpq_class a(1, 17);
    mpf_class x(a);

    printf("x->_mp_size = %d\n", (x.get_mpf_t())->_mp_size);
    printf("x->_mp_prec = %d\n", (x.get_mpf_t())->_mp_prec);
    printf("x->_mp_exp = %ld\n", (x.get_mpf_t())->_mp_exp);

    gmp_printf("%.60Ff\n", x.get_mpf_t());

}

mpf_classはコンストラクタに有理数のmpq_classを受け取ることができる.
上のコードを実行すると,

x->_mp_size = 2
x->_mp_prec = 2
x->_mp_exp = 0
0.058823529411764705882400000000000000000000000000000000000000

_mp_precが2となっている.おそらくこれは,mpq_classを受け取るコンストラクタが mpf_get_default_prec()が返す値を設定している.

mpf_classのコンストラクタには精度の初期値を与えることができるので, mpf_class x(a, 200);というふうに書き換える.これで実行すると

x->_mp_size = 5
x->_mp_prec = 5
x->_mp_exp = 0
0.058823529411764705882352941176470588235294117647058823529412