summaryrefslogtreecommitdiff
path: root/tests/tcos.c
diff options
context:
space:
mode:
authorthevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2008-04-22 15:33:01 +0000
committerthevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2008-04-22 15:33:01 +0000
commit264b023976634f2687ba6380f9fdb0f4e2767a35 (patch)
tree54dab1d280b72e4fcba21099aba02e60a38ac6e0 /tests/tcos.c
parentdc4b081efa36628e66f764cb3bb802e3a3a4bbff (diff)
downloadmpc-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.c238
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);