From 9b7aff4bad05a0340d6e3af308ba991cf9d7e454 Mon Sep 17 00:00:00 2001 From: John Marino Date: Fri, 13 Mar 2015 17:03:07 +0100 Subject: [PATCH] Update MPC library from version 1.0.1 to 1.0.3 --- contrib/mpc/src/atan.c | 10 +++++----- contrib/mpc/src/get_version.c | 5 +++-- contrib/mpc/src/log10.c | 19 ++++--------------- contrib/mpc/src/mpc.h | 6 +++--- contrib/mpc/src/pow.c | 17 ++++++++--------- 5 files changed, 23 insertions(+), 34 deletions(-) diff --git a/contrib/mpc/src/atan.c b/contrib/mpc/src/atan.c index c0b01a4045..285f79f6cb 100644 --- a/contrib/mpc/src/atan.c +++ b/contrib/mpc/src/atan.c @@ -1,6 +1,6 @@ /* mpc_atan -- arctangent of a complex number. -Copyright (C) 2009, 2010, 2011, 2012 INRIA +Copyright (C) 2009, 2010, 2011, 2012, 2013 INRIA This file is part of GNU MPC. @@ -133,10 +133,10 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) } else if (cmp_1 == 0) { - /* atan(+/-0+i) = NaN +i*inf - atan(+/-0-i) = NaN -i*inf */ - mpfr_set_nan (mpc_realref (rop)); - mpfr_set_inf (mpc_imagref (rop), s_im ? -1 : +1); + /* atan(+/-0 +i) = +/-0 +i*inf + atan(+/-0 -i) = +/-0 -i*inf */ + mpfr_set_zero (mpc_realref (rop), s_re ? -1 : +1); + mpfr_set_inf (mpc_imagref (rop), s_im ? -1 : +1); } else { diff --git a/contrib/mpc/src/get_version.c b/contrib/mpc/src/get_version.c index 07c4264b47..88e7e986a9 100644 --- a/contrib/mpc/src/get_version.c +++ b/contrib/mpc/src/get_version.c @@ -1,6 +1,6 @@ /* mpc_get_version -- MPC version -Copyright (C) 2008, 2009, 2010, 2011, 2012 INRIA +Copyright (C) 2008, 2009, 2010, 2011, 2012, 2014, 2015 INRIA This file is part of GNU MPC. @@ -44,5 +44,6 @@ mpfr_regular_p (mpfr_srcptr z) const char * mpc_get_version (void) { - return "1.0.1"; + return "1.0.3"; } + diff --git a/contrib/mpc/src/log10.c b/contrib/mpc/src/log10.c index a6fc86ce69..4e77aafe15 100644 --- a/contrib/mpc/src/log10.c +++ b/contrib/mpc/src/log10.c @@ -77,16 +77,6 @@ mpc_log10_aux (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd, int flag, int nb) ret = mpfr_set (mpc_imagref (rop), mpc_imagref (tmp), MPC_RND_IM (rnd)); break; - case 3: /* real <- log(y) */ - mpfr_log (mpc_realref (tmp), mpc_imagref (op), MPC_RND_RE (rnd)); - mpfr_div (mpc_realref (tmp), mpc_realref (tmp), log10, GMP_RNDN); - ok = mpfr_can_round (mpc_realref (tmp), prec - 2, GMP_RNDN, - GMP_RNDZ, MPC_PREC_RE(rop) + - (MPC_RND_RE (rnd) == GMP_RNDN)); - if (ok) - ret = mpfr_set (mpc_realref (rop), mpc_realref (tmp), - MPC_RND_RE (rnd)); - break; } prec += prec / 2; mpc_set_prec (tmp, prec); @@ -197,17 +187,16 @@ mpc_log10 (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) { if (im_cmp > 0) { - inex_re = mpc_log10_aux (rop, op, rnd, 0, 3); + inex_re = mpfr_log10 (mpc_realref (rop), mpc_imagref (op), MPC_RND_RE (rnd)); inex_im = mpc_log10_aux (rop, op, rnd, 1, 2); /* division by 2 does not change the ternary flag */ mpfr_div_2ui (mpc_imagref (rop), mpc_imagref (rop), 1, GMP_RNDN); } else { - ww->re[0] = *mpc_realref (op); - ww->im[0] = *mpc_imagref (op); - MPFR_CHANGE_SIGN (ww->im); - inex_re = mpc_log10_aux (rop, ww, rnd, 0, 3); + w [0] = *mpc_imagref (op); + MPFR_CHANGE_SIGN (w); + inex_re = mpfr_log10 (mpc_realref (rop), w, MPC_RND_RE (rnd)); invrnd = MPC_RND (0, INV_RND (MPC_RND_IM (rnd))); inex_im = mpc_log10_aux (rop, op, invrnd, 1, 2); /* division by 2 does not change the ternary flag */ diff --git a/contrib/mpc/src/mpc.h b/contrib/mpc/src/mpc.h index 02c19438b0..f6e1beefe2 100644 --- a/contrib/mpc/src/mpc.h +++ b/contrib/mpc/src/mpc.h @@ -1,6 +1,6 @@ /* mpc.h -- Include file for mpc. -Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012 INRIA +Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2014, 2015 INRIA This file is part of GNU MPC. @@ -32,8 +32,8 @@ along with this program. If not, see http://www.gnu.org/licenses/ . /* Define MPC version number */ #define MPC_VERSION_MAJOR 1 #define MPC_VERSION_MINOR 0 -#define MPC_VERSION_PATCHLEVEL 1 -#define MPC_VERSION_STRING "1.0.1" +#define MPC_VERSION_PATCHLEVEL 3 +#define MPC_VERSION_STRING "1.0.3" /* Macros dealing with MPC VERSION */ #define MPC_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) diff --git a/contrib/mpc/src/pow.c b/contrib/mpc/src/pow.c index 892f467c57..2525644a4c 100644 --- a/contrib/mpc/src/pow.c +++ b/contrib/mpc/src/pow.c @@ -645,7 +645,7 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) pi = mpfr_get_prec (mpc_imagref(z)); p = (pr > pi) ? pr : pi; p += 12; /* experimentally, seems to give less than 10% of failures in - Ziv's strategy; probably wrong now since q is not computed */ + Ziv's strategy; probably wrong now since q is not computed */ if (p < 64) p = 64; mpc_init2 (u, p); @@ -658,18 +658,17 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) { int ret_exp; mpfr_exp_t dr, di; - mpfr_prec_t q=0; - /* to avoid warning message, real initialisation below */ + mpfr_prec_t q; mpc_log (t, x, MPC_RNDNN); mpc_mul (t, t, y, MPC_RNDNN); - if (loop == 0) { - /* compute q such that |Re (y log x)|, |Im (y log x)| < 2^q */ - q = mpfr_get_exp (mpc_realref(t)) > 0 ? mpfr_get_exp (mpc_realref(t)) : 0; - if (mpfr_get_exp (mpc_imagref(t)) > (mpfr_exp_t) q) - q = mpfr_get_exp (mpc_imagref(t)); - } + /* Compute q such that |Re (y log x)|, |Im (y log x)| < 2^q. + We recompute it at each loop since we might get different + bounds if the precision is not enough. */ + q = mpfr_get_exp (mpc_realref(t)) > 0 ? mpfr_get_exp (mpc_realref(t)) : 0; + if (mpfr_get_exp (mpc_imagref(t)) > (mpfr_exp_t) q) + q = mpfr_get_exp (mpc_imagref(t)); mpfr_clear_overflow (); mpfr_clear_underflow (); -- 2.41.0