summaryrefslogtreecommitdiff
path: root/src/acos.c
diff options
context:
space:
mode:
authorPaul Zimmermann <Paul.Zimmermann@inria.fr>2020-02-06 18:35:19 +0100
committerPaul Zimmermann <Paul.Zimmermann@inria.fr>2020-02-06 18:35:19 +0100
commit0fce03e7e78fe6bf789e3d372fdc6dbd27bf63a6 (patch)
tree8bd293d0f99c83ca2931616eeef66348b1dea866 /src/acos.c
parentfbcde25676931fbdbf707d03fd980c1936a00b02 (diff)
downloadmpc-git-0fce03e7e78fe6bf789e3d372fdc6dbd27bf63a6.tar.gz
enlarge internal exponent range for several functions + mpcheck cleanup
Diffstat (limited to 'src/acos.c')
-rw-r--r--src/acos.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/acos.c b/src/acos.c
index b95387d..294c463 100644
--- a/src/acos.c
+++ b/src/acos.c
@@ -31,6 +31,7 @@ mpc_acos (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
mpfr_exp_t e1, e2;
mpfr_rnd_t rnd_im;
mpc_rnd_t rnd1;
+ mpfr_exp_t saved_emin, saved_emax;
inex_re = 0;
inex_im = 0;
@@ -170,6 +171,11 @@ mpc_acos (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
return MPC_INEX (inex_re, inex_im);
}
+ saved_emin = mpfr_get_emin ();
+ saved_emax = mpfr_get_emax ();
+ mpfr_set_emin (mpfr_get_emin_min ());
+ mpfr_set_emax (mpfr_get_emax_max ());
+
/* regular complex argument: acos(z) = Pi/2 - asin(z) */
p_re = mpfr_get_prec (mpc_realref(rop));
p_im = mpfr_get_prec (mpc_imagref(rop));
@@ -225,5 +231,11 @@ mpc_acos (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
mpc_clear (z1);
mpfr_clear (pi_over_2);
+ /* restore the exponent range, and check the range of results */
+ mpfr_set_emin (saved_emin);
+ mpfr_set_emax (saved_emax);
+ inex_re = mpfr_check_range (mpc_realref (rop), inex_re, MPC_RND_RE (rnd));
+ inex_im = mpfr_check_range (mpc_imagref (rop), inex_im, MPC_RND_IM (rnd));
+
return MPC_INEX(inex_re, inex_im);
}