summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--get_str.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/get_str.c b/get_str.c
index fdd0c9b6a..5d5a6ae14 100644
--- a/get_str.c
+++ b/get_str.c
@@ -412,7 +412,7 @@ mpfr_get_str (char *s, mp_exp_t *e, int b, size_t m, mpfr_srcptr x, mp_rnd_t rnd
{
int exact; /* exact result */
mp_exp_t exp, g;
- mp_exp_t prec, log_2prec; /* precision of the computation */
+ mp_exp_t prec; /* precision of the computation */
long err;
mp_limb_t *a;
mp_exp_t exp_a;
@@ -424,6 +424,7 @@ mpfr_get_str (char *s, mp_exp_t *e, int b, size_t m, mpfr_srcptr x, mp_rnd_t rnd
char *s0;
int neg;
int ret; /* return value of mpfr_get_str_aux */
+ MPFR_ZIV_DECL (loop);
TMP_DECL(marker);
/* if exact = 1 then err is undefined */
@@ -579,11 +580,11 @@ mpfr_get_str (char *s, mp_exp_t *e, int b, size_t m, mpfr_srcptr x, mp_rnd_t rnd
exact = 1;
prec = (mp_exp_t) mpfr_ceil_double ((double) m / log_b2[b-2]) + 1;
exp = ((mp_exp_t) m < g) ? g - (mp_exp_t) m : (mp_exp_t) m - g;
- log_2prec = (mp_exp_t) MPFR_INT_CEIL_LOG2 (prec);
- prec += log_2prec; /* number of guard bits */
+ prec += MPFR_INT_CEIL_LOG2 (prec); /* number of guard bits */
if (exp != 0) /* add maximal exponentiation error */
prec += 3 * (mp_exp_t) MPFR_INT_CEIL_LOG2 (exp);
+ MPFR_ZIV_INIT (loop, prec);
for (;;)
{
TMP_MARK(marker);
@@ -689,7 +690,7 @@ mpfr_get_str (char *s, mp_exp_t *e, int b, size_t m, mpfr_srcptr x, mp_rnd_t rnd
if (ret == MPFR_ROUND_FAILED)
{
/* too large error: increment the working precision */
- prec += log_2prec;
+ MPFR_ZIV_NEXT (loop, prec);
}
else if (ret == -MPFR_ROUND_FAILED)
{
@@ -705,10 +706,12 @@ mpfr_get_str (char *s, mp_exp_t *e, int b, size_t m, mpfr_srcptr x, mp_rnd_t rnd
exp ++;
}
}
- else break;
+ else
+ break;
TMP_FREE(marker);
}
+ MPFR_ZIV_FREE (loop);
*e += g;