summaryrefslogtreecommitdiff
path: root/gmp_op.c
diff options
context:
space:
mode:
authorpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2005-02-14 14:18:40 +0000
committerpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2005-02-14 14:18:40 +0000
commit099491cf0f26d411fc581489cf740b3a75bb8298 (patch)
treebde3053d8cc9f324b515962ea14bbd4bef62ad94 /gmp_op.c
parentde3969c18addea0e0ca2bd9b4c28558df7ab9676 (diff)
downloadmpfr-099491cf0f26d411fc581489cf740b3a75bb8298.tar.gz
Clean up code.
Add generic ZivLoop controller. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@3305 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'gmp_op.c')
-rw-r--r--gmp_op.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/gmp_op.c b/gmp_op.c
index 7ebf8a273..961071db0 100644
--- a/gmp_op.c
+++ b/gmp_op.c
@@ -143,9 +143,10 @@ int
mpfr_add_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z, mp_rnd_t rnd_mode)
{
mpfr_t t,q;
- mp_prec_t p = MPFR_PREC(y)+10;
+ mp_prec_t p;
mp_exp_t err;
int res;
+ MPFR_ZIV_DECL (loop);
if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
{
@@ -171,8 +172,11 @@ mpfr_add_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z, mp_rnd_t rnd_mode)
}
}
+ p = MPFR_PREC (y) + 10;
mpfr_init2 (t, p);
mpfr_init2 (q, p);
+
+ MPFR_ZIV_INIT (loop, p);
for (;;)
{
res = mpfr_set_q (q, z, GMP_RNDN); /* Error <= 1/2 ulp(q) */
@@ -192,18 +196,18 @@ mpfr_add_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z, mp_rnd_t rnd_mode)
if (MPFR_LIKELY (!MPFR_IS_ZERO (t)))
{
err = (mp_exp_t) p - 1 - MAX (MPFR_GET_EXP(q)-MPFR_GET_EXP(t), 0);
- res = mpfr_can_round (t, err, GMP_RNDN, GMP_RNDZ,
- MPFR_PREC(y) + (rnd_mode == GMP_RNDN) );
- if (MPFR_LIKELY (res != 0)) /* We can round! */
+ if (MPFR_LIKELY (mpfr_can_round (t, err, GMP_RNDN, GMP_RNDZ,
+ MPFR_PREC(y) + (rnd_mode == GMP_RNDN))))
{
- res = mpfr_set(y, t, rnd_mode);
+ res = mpfr_set (y, t, rnd_mode);
break;
}
}
- p += BITS_PER_MP_LIMB; /* Next precision if we continue */
+ MPFR_ZIV_NEXT (loop, p);
mpfr_set_prec (t, p);
mpfr_set_prec (q, p);
}
+ MPFR_ZIV_FREE (loop);
mpfr_clear (t);
mpfr_clear (q);
return res;
@@ -213,9 +217,10 @@ int
mpfr_sub_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z,mp_rnd_t rnd_mode)
{
mpfr_t t,q;
- mp_prec_t p = MPFR_PREC (y)+10;
+ mp_prec_t p;
int res;
mp_exp_t err;
+ MPFR_ZIV_DECL (loop);
if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
{
@@ -246,8 +251,11 @@ mpfr_sub_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z,mp_rnd_t rnd_mode)
}
}
+ p = MPFR_PREC (y) + 10;
mpfr_init2 (t, p);
mpfr_init2 (q, p);
+
+ MPFR_ZIV_INIT (loop, p);
for(;;)
{
res = mpfr_set_q(q, z, GMP_RNDN); /* Error <= 1/2 ulp(q) */
@@ -275,10 +283,11 @@ mpfr_sub_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z,mp_rnd_t rnd_mode)
break;
}
}
- p += BITS_PER_MP_LIMB; /* Next precision if we continue */
+ MPFR_ZIV_NEXT (loop, p);
mpfr_set_prec (t, p);
mpfr_set_prec (q, p);
}
+ MPFR_ZIV_FREE (loop);
mpfr_clear (t);
mpfr_clear (q);
return res;