summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2012-10-01 12:19:32 +0000
committerenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2012-10-01 12:19:32 +0000
commitdea4bb627df4b2f9aef4cfd3f8c95fd44c667bfc (patch)
tree913538454b2c529693f9bac9657c2ba8a49aca67
parent46acbfd22ac531bcf17b1dffaddf97c3483a52cb (diff)
downloadmpc-dea4bb627df4b2f9aef4cfd3f8c95fd44c667bfc.tar.gz
backported fix in r1276-1277 to branch 1.0
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/branches/1.0@1279 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r--NEWS4
-rw-r--r--src/log10.c19
-rw-r--r--tests/log10.dat4
3 files changed, 12 insertions, 15 deletions
diff --git a/NEWS b/NEWS
index 9fd2149..0e2179a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+Changes in version 1.0.2:
+ - Fixed mpc_log10 for purely imaginary argument, see
+ http://lists.gforge.inria.fr/pipermail/mpc-discuss/2012-September/001208.html
+
Changes in version 1.0.1:
- Switched to automake 1.11.6, see
https://lists.gnu.org/archive/html/automake/2012-07/msg00023.html
diff --git a/src/log10.c b/src/log10.c
index a6fc86c..4e77aaf 100644
--- a/src/log10.c
+++ b/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/tests/log10.dat b/tests/log10.dat
index fe49e28..9316c79 100644
--- a/tests/log10.dat
+++ b/tests/log10.dat
@@ -173,3 +173,7 @@
# log10(3+I) has an exact real part (from Joseph S. Myers)
0 + 53 0.5 53 0x8f168ee8415e7p-54 2 3 2 1 N N
+
+# bug found by Mickael Gastineau on 29 Sep 2012
+0 + 2 +0 2 0.75 2 +0 2 1 N N
+0 - 2 +0 2 -0.75 2 +0 2 -1 N N