86{
88 mpfr_t fracpart, tmp1, tmp2;
89 mpz_t intpart, a, b, c, d, q,
p;
90 mpq_t tmp3;
91
92
94 mpfr_init2(fracpart, mpfr_get_prec(
x));
95 mpfr_abs(fracpart,
x, MPFR_RNDN);
96 mpz_init(intpart);
97 mpfr_get_z(intpart, fracpart, MPFR_RNDD);
98 mpfr_frac(fracpart, fracpart, MPFR_RNDN);
99
100
101
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);
110 mpq_init(tmp3);
111
112
113 while (mpz_cmp(q, height) <= 0) {
114 mpfr_mul_z(tmp1, fracpart, q, MPFR_RNDN);
115
116
117 if (mpfr_cmp_z(tmp1,
p) <= 0) {
119 mpz_set(d, q);
120 } else {
122 mpz_set(b, q);
123 }
125 mpz_add(q, b, d);
126 }
127
128
129
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);
134
135
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);
139
140 if (mpfr_cmp(tmp1, tmp2) <= 0) {
142 mpq_set_z(tmp3, b);
143 } else {
145 mpq_set_z(tmp3, d);
146 }
147
148
150 mpq_set_z(tmp3, intpart);
152 mpq_set_si(tmp3, sgn, 1);
155
156 mpz_clears(intpart, a, b, c, d,
p, q,
nullptr);
157 mpfr_clears(fracpart, tmp1, tmp2, nullptr);
158 mpq_clear(tmp3);
159}
VALGRIND_MAKE_MEM_DEFINED & result(result)
int sgn(const mpreal &op)