diff options
author | enge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2012-06-26 17:25:00 +0000 |
---|---|---|
committer | enge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2012-06-26 17:25:00 +0000 |
commit | 24dc1e9d3e1a89f4e2003040c5fbb5fbede90aa8 (patch) | |
tree | 82a86f47b8f61d7782a3f5f9a38386022f8409a7 | |
parent | 635cb7b060170f4cd0e80b74e7027f878e7f0aa2 (diff) | |
download | mpc-24dc1e9d3e1a89f4e2003040c5fbb5fbede90aa8.tar.gz |
log.c: improve test coverage by flagging intermediate overflow by an assert
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@1176 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r-- | src/log.c | 33 |
1 files changed, 15 insertions, 18 deletions
@@ -1,6 +1,6 @@ /* mpc_log -- Take the logarithm of a complex number. -Copyright (C) 2008, 2009, 2010, 2011 INRIA +Copyright (C) 2008, 2009, 2010, 2011, 2012 INRIA This file is part of GNU MPC. @@ -18,6 +18,7 @@ You should have received a copy of the GNU Lesser General Public License along with this program. If not, see http://www.gnu.org/licenses/ . */ +#include <stdio.h> /* for MPC_ASSERT */ #include "mpc-impl.h" int @@ -121,23 +122,19 @@ mpc_log (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd){ /* w is rounded down */ mpc_norm (w, op, GMP_RNDD); - /* error 1 ulp */ - - if (mpfr_inf_p (w)) - /* FIXME - return +inf, which is wrong since the logarithm is representable */ - ok = 1; - else { - mpfr_log (w, w, GMP_RNDD); - /* generic error of log: (2^(2 - exp(w)) + 1) ulp */ - - if (mpfr_get_exp (w) >= 2) - ok = mpfr_can_round (w, prec - 2, GMP_RNDD, - MPC_RND_RE(rnd), MPC_PREC_RE(rop)); - else - ok = mpfr_can_round (w, prec - 3 + mpfr_get_exp (w), GMP_RNDD, - MPC_RND_RE(rnd), MPC_PREC_RE(rop)); - } + /* error 1 ulp */ + MPC_ASSERT (!mpfr_inf_p (w)); + /* FIXME: intermediate overflow; the logarithm may be representable */ + + mpfr_log (w, w, GMP_RNDD); + /* generic error of log: (2^(2 - exp(w)) + 1) ulp */ + + if (mpfr_get_exp (w) >= 2) + ok = mpfr_can_round (w, prec - 2, GMP_RNDD, + MPC_RND_RE(rnd), MPC_PREC_RE(rop)); + else + ok = mpfr_can_round (w, prec - 3 + mpfr_get_exp (w), GMP_RNDD, + MPC_RND_RE(rnd), MPC_PREC_RE(rop)); } while (ok == 0); /* imaginary part */ |