わかってない部分が多すぎる.
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