diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2011-03-07 11:08:08 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2011-03-07 11:08:08 +0000 |
commit | e81346238e9e41467b58a08287932f0bed0d6f9a (patch) | |
tree | 031c4ae6f455686d6eeff14c1606c28c90430e7f /src/jn.c | |
parent | be447fa86561d761ebd70c98980127e303d82348 (diff) | |
download | mpfr-e81346238e9e41467b58a08287932f0bed0d6f9a.tar.gz |
[src/jn.c] Added comments and fixed a bug.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@7537 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/jn.c')
-rw-r--r-- | src/jn.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -215,6 +215,9 @@ mpfr_jn (mpfr_ptr res, long n, mpfr_srcptr z, mpfr_rnd_t r) MPFR_LOG_MSG (("loop on k, k = %lu\n", k)); mpfr_mul (t, t, y, MPFR_RNDN); mpfr_neg (t, t, MPFR_RNDN); + /* Mathematically: absn <= LONG_MAX + 1 <= (ULONG_MAX + 1) / 2, + and in practice, k is not very large, so that one should have + k + absn <= ULONG_MAX. */ MPFR_ASSERTN (absn <= ULONG_MAX - k); if (k + absn <= ULONG_MAX / k) mpfr_div_ui (t, t, k * (k + absn), MPFR_RNDN); @@ -231,8 +234,9 @@ mpfr_jn (mpfr_ptr res, long n, mpfr_srcptr z, mpfr_rnd_t r) exps = MPFR_IS_ZERO (s) ? MPFR_EMIN_MIN : MPFR_GET_EXP (s); if (exps > expT) expT = exps; + /* Above it has been checked that k + absn <= ULONG_MAX. */ if (MPFR_GET_EXP (t) + (mpfr_exp_t) prec <= exps && - zz / (2 * k) < k + n) + zz / (2 * k) < k + absn) break; } /* the error is bounded by (4k^2+21/2k+7) ulp(s)*2^(expT-exps) |