88 mpfr_t fracpart, tmp1, tmp2;
89 mpz_t intpart, a, b, c, d, q,
p;
94 mpfr_init2(fracpart, mpfr_get_prec(
x));
95 mpfr_abs(fracpart,
x, MPFR_RNDN);
97 mpfr_get_z(intpart, fracpart, MPFR_RNDD);
98 mpfr_frac(fracpart, fracpart, MPFR_RNDN);
102 mpfr_init2(tmp1, mpfr_get_prec(
x));
103 mpfr_init2(tmp2, mpfr_get_prec(
x));
104 mpz_init_set_ui(a, 0);
105 mpz_init_set_ui(b, 1);
106 mpz_init_set_ui(c, 1);
107 mpz_init_set_ui(d, 1);
108 mpz_init_set_ui(
p, 1);
109 mpz_init_set_ui(q, 2);
113 while (mpz_cmp(q, height) <= 0) {
114 mpfr_mul_z(tmp1, fracpart, q, MPFR_RNDN);
117 if (mpfr_cmp_z(tmp1,
p) <= 0) {
130 mpfr_set_z(tmp1, a, MPFR_RNDN);
131 mpfr_neg(tmp1, tmp1, MPFR_RNDN);
132 mpfr_div_z(tmp1, tmp1, b, MPFR_RNDN);
133 mpfr_add(tmp1, tmp1, fracpart, MPFR_RNDN);
136 mpfr_set_z(tmp2, c, MPFR_RNDN);
137 mpfr_div_z(tmp2, tmp2, d, MPFR_RNDN);
138 mpfr_sub(tmp2, tmp2, fracpart, MPFR_RNDN);
140 if (mpfr_cmp(tmp1, tmp2) <= 0) {
150 mpq_set_z(tmp3, intpart);
152 mpq_set_si(tmp3, sgn, 1);
156 mpz_clears(intpart, a, b, c, d,
p, q,
nullptr);
157 mpfr_clears(fracpart, tmp1, tmp2,
nullptr);