From e43b94e204159f4460fce0d6ff93e33f226bd3e4 Mon Sep 17 00:00:00 2001 From: vlefevre Date: Tue, 11 Feb 2014 16:33:23 +0000 Subject: =?UTF-8?q?[src/atan.c]=20Fixed=20types=20of=20some=20variables,?= =?UTF-8?q?=20in=20particular=20unsigned=20=E2=86=92=20signed=20conversion?= =?UTF-8?q?=20of=20non-representable=20value=20(detected=20due=20to=20the?= =?UTF-8?q?=20new=20MPFR=5FSET=5FEXP=20assertion=20check=20in=20the=20set?= =?UTF-8?q?=5Fexp=20branch).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@8944 280ebfd0-de03-0410-8827-d642c229c3f4 --- src/atan.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/atan.c') diff --git a/src/atan.c b/src/atan.c index 57508ac65..4a78983c4 100644 --- a/src/atan.c +++ b/src/atan.c @@ -38,7 +38,7 @@ static void mpfr_atan_aux (mpfr_ptr y, mpz_ptr p, long r, int m, mpz_t *tab) { mpz_t *S, *Q, *ptoj; - unsigned long n, i, k, j, l; + mp_bitcnt_t n, i, k, j, l; /* unsigned type, which is >= unsigned long */ mpfr_exp_t diff, expo; int im, done; mpfr_prec_t mult, *accu, *log2_nb_terms; @@ -90,6 +90,7 @@ mpfr_atan_aux (mpfr_ptr y, mpz_ptr p, long r, int m, mpz_t *tab) mpz_mul (ptoj[im], ptoj[im - 1], ptoj[im - 1]); /* main loop */ n = 1UL << m; + MPFR_ASSERTN (n != 0); /* no overflow */ /* the ith term being X^i/(2i+1) with X=p/2^r, we can stop when p^i/2^(r*i) < 2^(-precy), i.e. r*i > precy + log2(p^i) */ for (i = k = done = 0; (i < n) && (done == 0); i += 2, k ++) @@ -127,6 +128,7 @@ mpfr_atan_aux (mpfr_ptr y, mpz_ptr p, long r, int m, mpz_t *tab) we can stop when r*i > precy i.e. i > precy/r */ { n = 1UL << m; + MPFR_ASSERTN (n != 0); /* no overflow */ for (i = k = 0; (i < n) && (i <= precy / r); i += 2, k ++) { mpz_set_ui (Q[k + 1], 2 * i + 3); @@ -183,7 +185,9 @@ mpfr_atan_aux (mpfr_ptr y, mpz_ptr p, long r, int m, mpz_t *tab) mpz_tdiv_q (S[0], S[0], Q[0]); mpfr_set_z (y, S[0], MPFR_RNDD); - MPFR_SET_EXP (y, MPFR_EXP(y) + expo - r * (i - 1)); + /* TODO: Check/prove that the following expression doesn't overflow. */ + expo = MPFR_GET_EXP (y) + expo - r * (i - 1); + MPFR_SET_EXP (y, expo); } int -- cgit v1.2.1