diff options
author | thevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2008-04-22 15:33:01 +0000 |
---|---|---|
committer | thevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2008-04-22 15:33:01 +0000 |
commit | 264b023976634f2687ba6380f9fdb0f4e2767a35 (patch) | |
tree | 54dab1d280b72e4fcba21099aba02e60a38ac6e0 /tests/tcos.c | |
parent | dc4b081efa36628e66f764cb3bb802e3a3a4bbff (diff) | |
download | mpc-264b023976634f2687ba6380f9fdb0f4e2767a35.tar.gz |
Add special values processing in mpc_cos as in the C99 standard
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@118 211d60ee-9f03-0410-a15a-8952a2c7a4e4
Diffstat (limited to 'tests/tcos.c')
-rw-r--r-- | tests/tcos.c | 238 |
1 files changed, 237 insertions, 1 deletions
diff --git a/tests/tcos.c b/tests/tcos.c index 760689a..1ff71f3 100644 --- a/tests/tcos.c +++ b/tests/tcos.c @@ -28,6 +28,241 @@ MA 02111-1307, USA. */ #define TEST_FUNCTION mpc_cos #include "tgeneric.c" +static void +test_failed (mpc_t op, mpc_t get, mpc_t expected) +{ + printf ("mpc_sin(op) failed with "); + OUT (op); + printf (" "); + OUT (get); + OUT (expected); + exit (1); +} + +/* check special values as defined in C99 standard */ +static void +special () +{ + mpc_t z; + mpc_t c; + mpc_t c99; + + mpc_init (z); + mpc_init (c); + mpc_init (c99); + + mpfr_set_nan (MPC_RE (z)); + /* cos(NaN +i*NaN) = NaN +i*NaN */ + mpfr_set_nan (MPC_IM (z)); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, z); + + /* cos(NaN +i*Inf) = -Inf +i*NaN */ + mpfr_set_inf (MPC_IM (z), +1); + mpfr_set_inf (MPC_RE (c99), -1); + mpfr_set_nan (MPC_IM (c99)); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_inf_p (MPC_RE (c)) || mpfr_sgn (MPC_RE (c)) >=0 + || !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + + /* cos(NaN -i*Inf) = +Inf +i*NaN */ + mpc_conj (z, z, MPC_RNDNN); + mpc_neg (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_inf_p (MPC_RE (c)) || mpfr_sgn (MPC_RE (c)) <=0 + || !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, z); + + /* cos(NaN +i*y) = NaN +i*NaN where 0<|y|<infinity */ + mpfr_set_ui (MPC_IM (z), 1, GMP_RNDN); + mpfr_set_nan (MPC_RE (c99)); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + mpc_conj (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + + /* cos(NaN +i*0) = NaN +/-i*0 */ + mpfr_set_ui (MPC_IM (z), 0, GMP_RNDN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_zero_p (MPC_IM (c))) + test_failed (z, c, z); + + /* cos(NaN -i*0) = NaN +/-i*0 */ + mpc_conj (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_zero_p (MPC_IM (c))) + test_failed (z, c, z); + + /* cos(+0 +i*NaN) = NaN +/-i*0 */ + mpc_mul_i (z, z, +1, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_zero_p (MPC_IM (c)) || !mpfr_nan_p (MPC_RE (c))) + test_failed (z, c, z); + + /* cos(-0 +i*NaN) = NaN -/+i*0 */ + mpc_neg (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_zero_p (MPC_IM (c)) || !mpfr_nan_p (MPC_RE (c))) + test_failed (z, c, z); + + /* cos(x +i*NaN) = NaN +i*NaN where x!=0 */ + mpfr_set_inf (MPC_RE (z), +1); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + mpc_neg (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + mpfr_set_ui (MPC_RE (z), +1, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + mpc_neg (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) && !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + + mpfr_set_inf (MPC_RE(z), -1); + /* cos(-Inf -i*Inf) = -/+Inf +i*NaN */ + mpfr_set_inf (MPC_IM(z), -1); + mpfr_set_inf (MPC_RE(c99), -1); + mpfr_set_nan (MPC_IM(c99)); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_IM (c)) || !mpfr_inf_p (MPC_RE (c))) + test_failed (z, c, c99); + + /* cos(-Inf +i*Inf) = +/-Inf +i*NaN */ + mpc_conj (z, z, MPC_RNDNN); + mpc_neg (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_IM (c)) || !mpfr_inf_p (MPC_RE (c))) + test_failed (z, c, c99); + + /* cos(+Inf -i*Inf) = -/+Inf +i*NaN */ + mpc_neg (z, z, MPC_RNDNN); + mpc_neg (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_IM (c)) || !mpfr_inf_p (MPC_RE (c))) + test_failed (z, c, c99); + + /* cos(+Inf +i*Inf) = +/-Inf +i*NaN */ + mpc_conj (z, z, MPC_RNDNN); + mpc_neg (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_IM (c)) || !mpfr_inf_p (MPC_RE (c))) + test_failed (z, c, c99); + + /* cos(x -i*Inf) = +Inf*(cos(x) +i*sin(x)) where 0<|x|<infinity */ + /* cos(x +i*Inf) = +Inf*(cos(x) -i*sin(x)) where 0<|x|<infinity */ + mpfr_set_ui (MPC_RE (z), 1, GMP_RNDN); + mpfr_set_inf (MPC_RE (c99), +1); + mpfr_set_inf (MPC_IM (c99), -1); + mpc_cos (c, z, MPC_RNDUU); + if (mpc_cmp (c, c99) != 0) + test_failed (z, c, c99); + mpc_conj (z, z, MPC_RNDNN); + mpc_conj (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDUU); + if (mpc_cmp (c, c99) != 0) + test_failed (z, c, c99); + mpfr_neg (MPC_RE (z), MPC_RE (z), GMP_RNDN); + mpc_conj (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDUU); + if (mpc_cmp (c, c99) != 0) + test_failed (z, c, c99); + mpc_conj (z, z, MPC_RNDNN); + mpc_conj (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDUU); + if (mpc_cmp (c, c99) != 0) + test_failed (z, c, c99); + + /* cos(+0 -i*Inf) = +Inf +i*0 */ + mpfr_set_ui (MPC_RE (z), 0, GMP_RNDN); + mpfr_set_inf (MPC_RE (c99), +1); + mpfr_set_ui (MPC_IM (c99), 0, GMP_RNDN); + mpc_cos (c, z, MPC_RNDNN); + if (mpc_cmp (c, c99) != 0) + test_failed (z, c, c99); + + /* cos(+0 +i*Inf) = +Inf -i*0 */ + mpc_conj (z, z, MPC_RNDNN); + mpc_conj (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (mpc_cmp (c, c99) != 0) + test_failed (z, c, z); + + /* cos(-0 -i*Inf) = +Inf -i0 */ + mpc_neg (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (mpc_cmp (c, c99) != 0) + test_failed (z, c, c99); + + /* cos(-0 +i*Inf) = +Inf +i*0 */ + mpc_conj (z, z, MPC_RNDNN); + mpc_conj (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (mpc_cmp (c, c99) != 0) + test_failed (z, c, c99); + + /* cos(-Inf +i*0) = NaN +/-i*0 */ + mpfr_set_inf (MPC_RE (z), -1); + mpfr_set_ui (MPC_IM (z), 0, GMP_RNDN); + mpfr_set_nan (MPC_RE (c99)); + mpfr_set_ui (MPC_IM (c99), 0, GMP_RNDN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) || !mpfr_zero_p (MPC_IM (c))) + test_failed (z, c, c99); + + /* cos(-Inf -i*0) = NaN -/+i*0 */ + mpc_conj (z, z, MPC_RNDNN); + mpc_conj (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) || !mpfr_zero_p (MPC_IM (c))) + test_failed (z, c, c99); + + /* cos(+Inf +i*0) = NaN -/+i*0 */ + mpc_neg (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) || !mpfr_zero_p (MPC_IM (c))) + test_failed (z, c, c99); + + /* cos(+Inf -i*0) = NaN +/-i*0 */ + mpc_conj (z, z, MPC_RNDNN); + mpc_conj (c99, c99, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) || !mpfr_zero_p (MPC_IM (c))) + test_failed (z, c, c99); + + /* cos(+/-Inf +i*y) = NaN +i*NaN where 0<|y|<infinity*/ + mpfr_set_ui (MPC_IM (z), 1, GMP_RNDN); + mpfr_set_nan (MPC_IM (c99)); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) || !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + mpc_conj (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) || !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + mpc_neg (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) || !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + mpc_conj (z, z, MPC_RNDNN); + mpc_cos (c, z, MPC_RNDNN); + if (!mpfr_nan_p (MPC_RE (c)) || !mpfr_nan_p (MPC_IM (c))) + test_failed (z, c, c99); + + mpc_clear (c99); + mpc_clear (c); + mpc_clear (z); +} + int main() { @@ -39,7 +274,7 @@ main() mpc_init (z); mpfr_init (g); - for (prec = 2; prec <= 1000; prec++) + for (prec = 2; prec <= 1000; prec+=2) { mpc_set_prec (x, prec); mpc_set_prec (z, prec); @@ -65,6 +300,7 @@ main() } } + special (); tgeneric (); mpc_clear (x); |