diff options
author | pelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-02-14 10:10:51 +0000 |
---|---|---|
committer | pelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-02-14 10:10:51 +0000 |
commit | 5d7f915cd5ac5427b9dcdd49443fd7d2b41ca37d (patch) | |
tree | 2aac1d1e9115ff5ccfddd175fe2f7cd502d26754 | |
parent | d6e0bd5a6bf47fdd47ca5efc698bec6c96faa2f0 (diff) | |
download | mpfr-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.c | 5 | ||||
-rw-r--r-- | asin.c | 7 | ||||
-rw-r--r-- | atan.c | 43 |
3 files changed, 12 insertions, 43 deletions
@@ -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); @@ -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); @@ -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)); |