diff options
author | Andreas Enge <andreas.enge@inria.fr> | 2012-06-30 13:41:48 +0000 |
---|---|---|
committer | Andreas Enge <andreas.enge@inria.fr> | 2012-06-30 13:41:48 +0000 |
commit | 17070468cdaf1b464e79d01defa8e00b961486a6 (patch) | |
tree | 61cd4a1c55fb6525db82a53321b38b2bcb0aca2e | |
parent | 5190c95ca464aa09499ccbfbb925796e7885b9e4 (diff) | |
download | mpc-git-17070468cdaf1b464e79d01defa8e00b961486a6.tar.gz |
log.c: use abs instead of norm to work around intermediate under- and overflow
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/mpc/trunk@1211 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r-- | src/log.c | 8 |
1 files changed, 2 insertions, 6 deletions
@@ -141,16 +141,12 @@ do { \ prec += mpc_ceil_log2 (prec) + 4; mpfr_set_prec (w, prec); - /* w is rounded down */ - mpc_norm (w, op, GMP_RNDN); + mpc_abs (w, op, GMP_RNDN); /* error 0.5 ulp */ - if (mpfr_inf_p (w) || mpfr_zero_p (w)) - /* intermediate over- or underflow; the logarithm may be representable */ - break; + MPC_ASSERT (!mpfr_inf_p (w) && !mpfr_zero_p (w)); mpfr_log (w, w, GMP_RNDN); /* generic error of log: (2^(- exp(w)) + 0.5) ulp */ - mpfr_div_2ui (w, w, 1, GMP_RNDN); err = MPC_MAX (-mpfr_get_exp (w), 0) + 1; /* number of lost digits */ |