diff options
author | enge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2012-06-30 13:41:48 +0000 |
---|---|---|
committer | enge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2012-06-30 13:41:48 +0000 |
commit | a21a393b37daf7a3ffa83a92f2ec40e36851e5f7 (patch) | |
tree | 61cd4a1c55fb6525db82a53321b38b2bcb0aca2e /src | |
parent | 0074f3be3db21027453a666e15a6862e41f4e59f (diff) | |
download | mpc-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
Diffstat (limited to 'src')
-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 */ |