summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2005-02-14 10:10:51 +0000
committerpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2005-02-14 10:10:51 +0000
commit5d7f915cd5ac5427b9dcdd49443fd7d2b41ca37d (patch)
tree2aac1d1e9115ff5ccfddd175fe2f7cd502d26754
parentd6e0bd5a6bf47fdd47ca5efc698bec6c96faa2f0 (diff)
downloadmpfr-5d7f915cd5ac5427b9dcdd49443fd7d2b41ca37d.tar.gz
Add ZivLoop controler.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@3295 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--acos.c5
-rw-r--r--asin.c7
-rw-r--r--atan.c43
3 files changed, 12 insertions, 43 deletions
diff --git a/acos.c b/acos.c
index d163bd146..dd5857e5a 100644
--- a/acos.c
+++ b/acos.c
@@ -29,6 +29,7 @@ mpfr_acos (mpfr_ptr acos, mpfr_srcptr x, mp_rnd_t rnd_mode)
mp_prec_t prec;
int sign, compared, inexact;
MPFR_SAVE_EXPO_DECL (expo);
+ MPFR_ZIV_DECL (loop);
/* Singular cases */
if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
@@ -93,6 +94,7 @@ mpfr_acos (mpfr_ptr acos, mpfr_srcptr x, mp_rnd_t rnd_mode)
mpfr_init2 (tmp, prec);
mpfr_init2 (arcc, prec);
+ MPFR_ZIV_INIT (loop, prec);
for (;;)
{
/* acos(x) = Pi/2 - asin(x) = Pi/2 - atan(x/sqrt(1-x^2)) */
@@ -108,10 +110,11 @@ mpfr_acos (mpfr_ptr acos, mpfr_srcptr x, mp_rnd_t rnd_mode)
if (mpfr_can_round (arcc, prec-supplement, GMP_RNDN, GMP_RNDZ,
MPFR_PREC (acos) + (rnd_mode == GMP_RNDN)))
break;
- prec += BITS_PER_MP_LIMB;
+ MPFR_ZIV_NEXT (loop, prec);
mpfr_set_prec (tmp, prec);
mpfr_set_prec (arcc, prec);
}
+ MPFR_ZIV_FREE (loop);
inexact = mpfr_set (acos, arcc, rnd_mode);
mpfr_clear (tmp);
diff --git a/asin.c b/asin.c
index 23dbebba1..3be0a6969 100644
--- a/asin.c
+++ b/asin.c
@@ -29,6 +29,7 @@ mpfr_asin (mpfr_ptr asin, mpfr_srcptr x, mp_rnd_t rnd_mode)
mp_prec_t prec;
mp_exp_t xp_exp;
MPFR_SAVE_EXPO_DECL (expo);
+ MPFR_ZIV_DECL (loop);
/* Special cases */
if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
@@ -93,7 +94,7 @@ mpfr_asin (mpfr_ptr asin, mpfr_srcptr x, mp_rnd_t rnd_mode)
prec = -2*MPFR_GET_EXP (x) + 10;
/* use asin(x) = atan(x/sqrt(1-x^2)) */
-
+ MPFR_ZIV_INIT (loop, prec);
for (;;)
{
mpfr_set_prec (xp, prec);
@@ -105,9 +106,9 @@ mpfr_asin (mpfr_ptr asin, mpfr_srcptr x, mp_rnd_t rnd_mode)
if (mpfr_can_round (xp, prec - xp_exp, GMP_RNDN, GMP_RNDZ,
MPFR_PREC (asin) + (rnd_mode == GMP_RNDN)))
break;
- prec += BITS_PER_MP_LIMB;
+ MPFR_ZIV_NEXT (loop, prec);
}
-
+ MPFR_ZIV_FREE (loop);
inexact = mpfr_set (asin, xp, rnd_mode);
mpfr_clear (xp);
diff --git a/atan.c b/atan.c
index afe219a89..80ece3c92 100644
--- a/atan.c
+++ b/atan.c
@@ -169,44 +169,6 @@ mpfr_atan_aux (mpfr_ptr y, mpz_ptr p, long r, int m, mpz_t *tab,
MPFR_SET_EXP (y, MPFR_EXP (y) + expo - r*(i-1) );
}
-/* Extract 2^i bits from 2^i-1 */
-#if 0
-static void
-mpfr_atan_extract (mpz_ptr z, mpfr_srcptr p, unsigned int i)
-{
- unsigned long two_i = 1UL << i, d;
- mp_size_t n = MPFR_LIMB_SIZE (p), mz, dm, k;
- mp_limb_t *ptr = MPFR_MANT (p), *cp;
-
- MPFR_ASSERTD (!MPFR_IS_SINGULAR (p));
-
- if (2*two_i <= BITS_PER_MP_LIMB) {
- mp_limb_t c = ptr[n-1];
- c >>= BITS_PER_MP_LIMB - 2*two_i + 1;
- c &= (MPFR_LIMB_ONE<<two_i) -1;
- mpz_set_ui (z, c);
- } else if (two_i > MPFR_PREC (p))
- mpz_set_ui (z, 0);
- else {
- mz = (two_i - 1) / BITS_PER_MP_LIMB + 1;
- MPZ_REALLOC (z, mz+1);
- cp = PTR (z);
- d = two_i -1;
- dm = d / BITS_PER_MP_LIMB;
- if (dm+mz < n)
- mpn_rshift (cp, ptr+n-dm-mz-1, mz+1, 1);
- else
- {
- mpn_lshift (cp+mz-(n-dm)+1, ptr, mz-(n-dm)+1, BITS_PER_MP_LIMB-1);
- MPN_ZERO (cp, mz-(n-dm));
- }
- cp [mz-1] &= MPFR_LIMB_HIGHBIT -1 ;
- MPN_NORMALIZE (cp, mz);
- SIZ (z) = mz;
- }
-}
-#endif
-
int
mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mp_rnd_t rnd_mode)
{
@@ -222,6 +184,7 @@ mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mp_rnd_t rnd_mode)
mpz_t *tabz;
unsigned int *tabi;
MPFR_SAVE_EXPO_DECL (expo);
+ MPFR_ZIV_DECL (loop);
/* Singular cases */
if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
@@ -296,6 +259,7 @@ mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mp_rnd_t rnd_mode)
tabz = NULL;
tabi = NULL;
+ MPFR_ZIV_INIT (loop, prec);
for (;;)
{
/* n0 = ceil(log2(realprec + 2 + 1+ln(2.4)/ln(2))) */
@@ -385,8 +349,9 @@ mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mp_rnd_t rnd_mode)
if (mpfr_can_round (arctgt, realprec, GMP_RNDN, GMP_RNDZ,
MPFR_PREC (atan) + (rnd_mode == GMP_RNDN)))
break;
- realprec += BITS_PER_MP_LIMB;
+ MPFR_ZIV_NEXT (loop, realprec);
}
+ MPFR_ZIV_FREE (loop);
inexact = mpfr_set4 (atan, arctgt, rnd_mode, MPFR_SIGN (x));