summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2013-12-20 17:31:09 +0000
committerzimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2013-12-20 17:31:09 +0000
commit382320d7b18653d5f76055ba49a7d4823ea5c1f6 (patch)
tree5c5396bae28007b781f2514eb85395899e836d55
parentb23b9af5c2b3fb6e4f762aa033ef0b91f58ee277 (diff)
downloadmpc-382320d7b18653d5f76055ba49a7d4823ea5c1f6.tar.gz
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
-rw-r--r--src/acos.c5
-rw-r--r--src/asin.c8
-rw-r--r--src/sin_cos.c2
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);