From 382320d7b18653d5f76055ba49a7d4823ea5c1f6 Mon Sep 17 00:00:00 2001 From: zimmerma Date: Fri, 20 Dec 2013 17:31:09 +0000 Subject: sin_cos.c: precision was increased by prec/2 too early acos.c: now increment precision by p/2 after two loops asin.c: precision was increased by prec/2 too early git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@1398 211d60ee-9f03-0410-a15a-8952a2c7a4e4 --- src/acos.c | 5 +++-- src/asin.c | 8 ++++---- src/sin_cos.c | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/acos.c b/src/acos.c index 6117786..b95387d 100644 --- a/src/acos.c +++ b/src/acos.c @@ -24,7 +24,7 @@ along with this program. If not, see http://www.gnu.org/licenses/ . int mpc_acos (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) { - int inex_re, inex_im, inex; + int inex_re, inex_im, inex, loop = 0; mpfr_prec_t p_re, p_im, p; mpc_t z1; mpfr_t pi_over_2; @@ -190,7 +190,8 @@ mpc_acos (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) mpfr_init2 (pi_over_2, p); for (;;) { - p += mpc_ceil_log2 (p) + 3; + loop ++; + p += (loop <= 2) ? mpc_ceil_log2 (p) + 3 : p / 2; mpfr_set_prec (mpc_realref(z1), p); mpfr_set_prec (pi_over_2, p); diff --git a/src/asin.c b/src/asin.c index 2d18489..e796461 100644 --- a/src/asin.c +++ b/src/asin.c @@ -23,10 +23,10 @@ along with this program. If not, see http://www.gnu.org/licenses/ . int mpc_asin (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) { - mpfr_prec_t p, p_re, p_im, incr_p = 0; + mpfr_prec_t p, p_re, p_im; mpfr_rnd_t rnd_re, rnd_im; mpc_t z1; - int inex; + int inex, loop = 0; /* special values */ if (mpfr_nan_p (mpc_realref (op)) || mpfr_nan_p (mpc_imagref (op))) @@ -148,8 +148,8 @@ mpc_asin (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) { mpfr_exp_t ex, ey, err; - p += mpc_ceil_log2 (p) + 3 + incr_p; /* incr_p is zero initially */ - incr_p = p / 2; + loop ++; + p += (loop <= 2) ? mpc_ceil_log2 (p) + 3 : p / 2; mpfr_set_prec (mpc_realref(z1), p); mpfr_set_prec (mpc_imagref(z1), p); diff --git a/src/sin_cos.c b/src/sin_cos.c index 980e413..fe44c42 100644 --- a/src/sin_cos.c +++ b/src/sin_cos.c @@ -317,7 +317,7 @@ mpc_sin_cos (mpc_ptr rop_sin, mpc_ptr rop_cos, mpc_srcptr op, do { loop ++; ok = 1; - prec += (loop == 1) ? mpc_ceil_log2 (prec) + 5 : prec / 2; + prec += (loop <= 2) ? mpc_ceil_log2 (prec) + 5 : prec / 2; mpfr_set_prec (s, prec); mpfr_set_prec (c, prec); -- cgit v1.2.1