diff options
author | pelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-03-02 08:57:26 +0000 |
---|---|---|
committer | pelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-03-02 08:57:26 +0000 |
commit | 9eef8ee765f1907cf64096a2ac829f673c2d97a7 (patch) | |
tree | d71afcd40d9c857760ec03dedd0eea3fc32836c0 /atan.c | |
parent | 6a3f420b5cfe497338aaf4987ae5289e387a8918 (diff) | |
download | mpfr-9eef8ee765f1907cf64096a2ac829f673c2d97a7.tar.gz |
Fix bug in estimated error (See previous ChangeLog).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@3354 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'atan.c')
-rw-r--r-- | atan.c | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -176,7 +176,6 @@ mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mp_rnd_t rnd_mode) mpfr_t arctgt, sk, tmp, tmp2; mpz_t ukz; int comparaison, inexact, inexact2; - mp_exp_t estimated_delta; mp_prec_t prec, realprec; mp_exp_t exptol; int i, n0, oldn0; @@ -242,12 +241,12 @@ mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mp_rnd_t rnd_mode) } realprec = MPFR_PREC (atan) + MPFR_INT_CEIL_LOG2 (MPFR_PREC (atan)) + 4; - if (MPFR_PREC (atan) + 5 > MPFR_PREC (x) && MPFR_GET_EXP (x) < 0) + /* if (MPFR_PREC (atan) + 5 > MPFR_PREC (x) && MPFR_GET_EXP (x) < 0) { mpfr_uexp_t ue = (mpfr_uexp_t) (-MPFR_GET_EXP (x)); if (realprec < 2*ue + 5) realprec = 2*ue + 5; - } + } */ prec = realprec + BITS_PER_MP_LIMB; MPFR_SAVE_EXPO_MARK (expo); @@ -266,10 +265,11 @@ mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mp_rnd_t rnd_mode) for (;;) { /* n0 = ceil(log2(realprec + 2 + 1+ln(2.4)/ln(2))) */ - n0 = MPFR_INT_CEIL_LOG2 (realprec + 2 + 3); + mp_prec_t sup = MAX (-MPFR_GET_EXP (xp), 0) + 2; + n0 = MPFR_INT_CEIL_LOG2 (realprec + sup + 3); MPFR_ASSERTD (3*n0 > 2); - estimated_delta = 1 + 2 + MPFR_INT_CEIL_LOG2 (3*n0-2); - prec = realprec + estimated_delta; + prec = realprec + 1 + sup + MPFR_INT_CEIL_LOG2 (3*n0-2); + /* printf ("Prec=%lu realprec=%lu\n", prec, realprec); */ /* Initialisation */ mpfr_set_prec (sk, prec); @@ -324,6 +324,7 @@ mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mp_rnd_t rnd_mode) mpz_mul (ukz, ukz, ukz); mpz_neg (ukz, ukz); mpfr_atan_aux (tmp2, ukz, 2*twopoweri, n0 - i, tabz, tabi); + mpfr_mul (tmp2, tmp2, tmp, GMP_RNDN); /* Addition and iteration */ |