ぺんぎんさんのおうち

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

22.01.2021

今日で学会終わり.発表は昨日やってた.
あとは卒論書いて発表資料作って終わりかな.今年度もクライマックスだ.卒業できるかな.

今まではmpzだけの話だったけど,今後は有理数浮動小数点にも話を拡げていこうかなと.
手始めにmpq, mpfの定義を探す.

有理数mpq_tの記述

typedef struct
{
  __mpz_struct _mp_num;
  __mpz_struct _mp_den;
} __mpq_struct;

typedef __mpq_struct mpq_t[1];

浮動小数点mpf_tの記述

typedef struct
{
  int _mp_prec;                 /* Max precision, in number of `mp_limb_t's.
                                   Set by mpf_init and modified by
                                   mpf_set_prec.  The area pointed to by the
                                   _mp_d field contains `prec' + 1 limbs.  */
  int _mp_size;                 /* abs(_mp_size) is the number of limbs the
                                   last field points to.  If _mp_size is
                                   negative this is a negative number.  */
  mp_exp_t _mp_exp;             /* Exponent, in the base of `mp_limb_t'.  */
  mp_limb_t *_mp_d;             /* Pointer to the limbs.  */
} __mpf_struct;

/* typedef __mpf_struct MP_FLOAT; */
typedef __mpf_struct mpf_t[1];

mpq_tは分子と分母がそれぞれmpz_tになってるだけ.そんなに難しくはない.四則演算の実装が重要だね.乗算では計算後に約分されるっぽいけど,途中計算におけるメモリ確保がどうなってるのかを重点的に見たほうがいいね.

mpf_tは大変そうだ.そもそも浮動小数点の知識が無い. メンバ変数に関しては,mpzでもおなじみの_mp_dや_mp_sizeに加えて,指数部を表す_mp_expが増えてる. _mp_precは_mp_allocと意味することは同じかな.