summaryrefslogtreecommitdiff
path: root/src/asin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/asin.c')
-rw-r--r--src/asin.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/asin.c b/src/asin.c
index 96749db..4cf2353 100644
--- a/src/asin.c
+++ b/src/asin.c
@@ -87,7 +87,7 @@ mpc_asin (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
mpfr_rnd_t rnd_re, rnd_im;
mpc_t z1;
int inex, inex_re, inex_im, loop = 0;
- mpfr_exp_t saved_emin, saved_emax, err;
+ mpfr_exp_t saved_emin, saved_emax, err, olderr;
/* special values */
if (mpfr_nan_p (mpc_realref (op)) || mpfr_nan_p (mpc_imagref (op)))
@@ -206,13 +206,14 @@ mpc_asin (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
rnd_im = MPC_RND_IM(rnd);
p = p_re >= p_im ? p_re : p_im;
mpc_init2 (z1, p);
- err = 0; /* number of lost bits */
+ olderr = err = 0; /* number of lost bits */
while (1)
{
mpfr_exp_t ex, ey;
loop ++;
- p += err; /* add number of lost bits in previous loop */
+ p += err - olderr; /* add extra number of lost bits in previous loop */
+ olderr = err;
p += (loop <= 2) ? mpc_ceil_log2 (p) + 3 : p / 2;
mpfr_set_prec (mpc_realref(z1), p);
mpfr_set_prec (mpc_imagref(z1), p);