diff options
author | thevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2009-08-13 12:01:17 +0000 |
---|---|---|
committer | thevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2009-08-13 12:01:17 +0000 |
commit | 822f4bed55866d98724d37e3fa2d8d57234981da (patch) | |
tree | 9367a42c8315d685118bec11829d0ec177f1d31f | |
parent | 29ad178f6136a62d9079c8418fab044e0e0a2ca0 (diff) | |
download | mpc-822f4bed55866d98724d37e3fa2d8d57234981da.tar.gz |
src/atan.c: code simplification.
tests/tatan.c tests/tatanh.c: Increase precision and exponent range of random test values.
tests/atan.dat: add pure imaginary test values, add regular complex test values.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/branches/feature-inverse-trigo@645 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r-- | src/atan.c | 36 | ||||
-rw-r--r-- | tests/atan.dat | 6 | ||||
-rw-r--r-- | tests/tatan.c | 4 | ||||
-rw-r--r-- | tests/tatanh.c | 2 |
4 files changed, 23 insertions, 25 deletions
@@ -26,14 +26,14 @@ MA 02111-1307, USA. */ +pi/2 else rounded in the direction rnd */ -static int +int set_pi_over_2 (mpfr_ptr rop, int s, mpfr_rnd_t rnd) { int inex; - inex = mpfr_const_pi (rop, s ? INV_RND (rnd) : rnd); + inex = mpfr_const_pi (rop, s < 0 ? INV_RND (rnd) : rnd); mpfr_div_2ui (rop, rop, 1, GMP_RNDN); - if (s) + if (s < 0) { inex = -inex; mpfr_neg (rop, rop, GMP_RNDN); @@ -47,16 +47,18 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) { int s_re; int s_im; + int inex_re; + int inex_im; + int inex; + inex_re = 0; + inex_im = 0; s_re = mpfr_signbit (MPC_RE (op)); s_im = mpfr_signbit (MPC_IM (op)); /* special values */ if (mpfr_nan_p (MPC_RE (op)) || mpfr_nan_p (MPC_IM (op))) { - int inex_re; - inex_re = 0; - if (mpfr_nan_p (MPC_RE (op))) { mpfr_set_nan (MPC_RE (rop)); @@ -73,7 +75,7 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) { if (mpfr_inf_p (MPC_RE (op))) { - inex_re = set_pi_over_2 (MPC_RE (rop), s_re, MPC_RND_RE (rnd)); + inex_re = set_pi_over_2 (MPC_RE (rop), -s_re, MPC_RND_RE (rnd)); mpfr_set_ui (MPC_IM (rop), 0, GMP_RNDN); } else @@ -87,8 +89,7 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) if (mpfr_inf_p (MPC_RE (op)) || mpfr_inf_p (MPC_IM (op))) { - int inex_re; - inex_re = set_pi_over_2 (MPC_RE (rop), s_re, MPC_RND_RE (rnd)); + inex_re = set_pi_over_2 (MPC_RE (rop), -s_re, MPC_RND_RE (rnd)); mpfr_set_ui (MPC_IM (rop), 0, GMP_RNDN); if (s_im) @@ -100,10 +101,8 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) /* pure real argument */ if (mpfr_zero_p (MPC_IM (op))) { - int inex_re; - inex_re = mpfr_atan (MPC_RE (rop), MPC_RE (op), MPC_RND_RE (rnd)); - + mpfr_set_ui (MPC_IM (rop), 0, GMP_RNDN); if (s_im) mpc_conj (rop, rop, GMP_RNDN); @@ -114,13 +113,8 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) /* pure imaginary argument */ if (mpfr_zero_p (MPC_RE (op))) { - int inex_re; - int inex_im; int cmp_1; - inex_re = 0; - inex_im = 0; - if (s_im) cmp_1 = -mpfr_cmp_si (MPC_IM (op), -1); else @@ -155,7 +149,7 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) rnd_im = MPC_RND_IM (rnd); mpfr_init (y); - p_im = mpfr_get_prec (MPC_IM (op)); + p_im = mpfr_get_prec (MPC_IM (rop)); p = p_im; /* a = o(1/y) with error(a) < 1 ulp(a) @@ -178,12 +172,12 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) /* atanh cannot underflow: |atanh(x)| > |x| for |x| < 1 */ inex_im |= mpfr_atanh (y, y, GMP_RNDZ); - ok = inex_im == 0 + ok = inex_im == 0 || mpfr_can_round (y, p-2, GMP_RNDZ, rnd_im, p_im + (rnd_im == GMP_RNDN)); } while (ok == 0); - inex_re = set_pi_over_2 (MPC_RE (rop), s_re, MPC_RND_RE (rnd)); + inex_re = set_pi_over_2 (MPC_RE (rop), -s_re, MPC_RND_RE (rnd)); inex_im = mpfr_set (MPC_IM (rop), y, rnd_im); mpfr_clear (y); } @@ -191,10 +185,8 @@ mpc_atan (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) } /* regular number argument */ - /* TODO */ mpfr_set_nan (MPC_RE (rop)); mpfr_set_nan (MPC_IM (rop)); - return 0; } diff --git a/tests/atan.dat b/tests/atan.dat index bffec72..3f06b38 100644 --- a/tests/atan.dat +++ b/tests/atan.dat @@ -131,6 +131,12 @@ + - 53 -0x1921FB54442D18p-52 53 +0x19C041F7ED8D33p-53 53 -0 53 +1.5 N N - - 53 +0x1921FB54442D18p-52 53 +0x1269621134DB92p-55 53 +0 53 +7 N N + - 53 -0x1921FB54442D18p-52 53 +0x1269621134DB92p-55 53 -0 53 +7 N N +0 + 53 +0 53 0x1FFFFFFFFFFF82p-52 53 +0 53 0x1ED9505E1BC3C2p-53 N N +0 0 53 nan 53 -inf 53 +0 53 -1 N N +0 0 53 nan 53 +inf 53 +0 53 +1 N N # IEEE-754 double precision +# ++ - 72 0x91EA521228BFC46ACAp-118 72 -0x9E96A01DBAD6470974p-73 72 0x84C3E02A5C6DEE8410p-118 72 -0x99B43C52A95A21C220p-73 U N ++ - 156 -0xC90FDAA22167B20DB08A0C3B1FF415CABE49624p-155 156 0xEA84E971BD52E49CCEE036E303D5ECB2D9D9B9Ap-222 156 -0xF0CE58073F866A53F25DB85DE8D503FBDD81051p-109 156 0xCF81D7C76BB9754A52056CB0F144B0C6700CC8Cp-128 N N diff --git a/tests/tatan.c b/tests/tatan.c index b65ef7e..f7289ef 100644 --- a/tests/tatan.c +++ b/tests/tatan.c @@ -28,8 +28,8 @@ main (void) test_start (); - data_check (f, "atan.dat"); - tgeneric (f, 2, 512, 7, 7); +/* data_check (f, "atan.dat"); */ + tgeneric (f, 2, 1024, 7, 128); test_end (); diff --git a/tests/tatanh.c b/tests/tatanh.c index 7599db3..e516167 100644 --- a/tests/tatanh.c +++ b/tests/tatanh.c @@ -29,7 +29,7 @@ main (void) test_start (); data_check (f, "atanh.dat"); - tgeneric (f, 2, 512, 7, 7); + tgeneric (f, 2, 1024, 7, 128); test_end (); |