summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2012-06-30 13:41:48 +0000
committerenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2012-06-30 13:41:48 +0000
commita21a393b37daf7a3ffa83a92f2ec40e36851e5f7 (patch)
tree61cd4a1c55fb6525db82a53321b38b2bcb0aca2e
parent0074f3be3db21027453a666e15a6862e41f4e59f (diff)
downloadmpc-a21a393b37daf7a3ffa83a92f2ec40e36851e5f7.tar.gz
log.c: use abs instead of norm to work around intermediate under- and overflow
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@1211 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r--src/log.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/src/log.c b/src/log.c
index 8c13164..0af4b4e 100644
--- a/src/log.c
+++ b/src/log.c
@@ -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 */