This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Move tests of cpow from libm-test.inc to auto-libm-test-in


This patch, relative to a tree with
<https://sourceware.org/ml/libc-alpha/2013-12/msg00735.html> applied,
moves tests of cpow to auto-libm-test-in, adding the required support
to gen-auto-libm-tests.

Tested x86_64 and x86 and ulps updated accordingly.

(auto-libm-test-out diffs omitted below.)

2013-12-20  Joseph Myers  <joseph@codesourcery.com>

	* math/auto-libm-test-in: Add tests of cpow.
	* math/auto-libm-test-out: Regenerated.
	* math/libm-test.inc (cpow_test_data): Use AUTO_TESTS_cc_c.
	* * math/gen-auto-libm-tests.c (func_calc_method): Add value
	mpc_cc_c.
	(func_calc_desc): Add mpc_cc_c union field.
	(test_functions): Add cpow.
	(special_fill_2pi): New function.
	(special_real_inputs): Add 2pi.
	(calc_generic_results): Handle mpc_cc_c.
	* sysdeps/i386/fpu/libm-test-ulps: Update.
	* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.

diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index 4b3c758..947b2af 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -412,6 +412,17 @@ cosh 22
 cosh 23
 cosh 24
 
+cpow 1 0 0 0
+cpow 2 0 10 0
+# Bug 14473: cpow results inaccurate.
+cpow e 0 0 2pi xfail
+cpow 2 3 4 0
+
+cpow 0.75 1.25 0.75 1.25
+cpow 0.75 1.25 1.0 1.0
+cpow 0.75 1.25 1.0 0.0
+cpow 0.75 1.25 0.0 1.0
+
 csqrt 0 0
 csqrt 0 -0
 csqrt -0 0
diff --git a/math/gen-auto-libm-tests.c b/math/gen-auto-libm-tests.c
index c96615f..e8a5393 100644
--- a/math/gen-auto-libm-tests.c
+++ b/math/gen-auto-libm-tests.c
@@ -409,6 +409,9 @@ typedef enum
     /* MPC function with a single complex argument and one complex
        result.  */
     mpc_c_c,
+    /* MPC function with two complex arguments and one complex
+       result.  */
+    mpc_cc_c,
   } func_calc_method;
 
 /* Description of how to calculate a function.  */
@@ -426,6 +429,7 @@ typedef struct
     int (*mpfr_f_11) (mpfr_t, mpfr_t, const mpfr_t, mpfr_rnd_t);
     int (*mpc_c_f) (mpfr_t, const mpc_t, mpfr_rnd_t);
     int (*mpc_c_c) (mpc_t, const mpc_t, mpc_rnd_t);
+    int (*mpc_cc_c) (mpc_t, const mpc_t, const mpc_t, mpc_rnd_t);
   } func;
 } func_calc_desc;
 
@@ -512,6 +516,8 @@ static test_function test_functions[] =
     FUNC_mpc_c_c ("clog10", mpc_log10, false),
     FUNC_mpfr_f_f ("cos", mpfr_cos, false),
     FUNC_mpfr_f_f ("cosh", mpfr_cosh, false),
+    FUNC ("cpow", ARGS4 (type_fp, type_fp, type_fp, type_fp),
+	  RET2 (type_fp, type_fp), false, true, CALC (mpc_cc_c, mpc_pow)),
     FUNC_mpc_c_c ("csin", mpc_sin, false),
     FUNC_mpc_c_c ("csinh", mpc_sinh, false),
     FUNC_mpc_c_c ("csqrt", mpc_sqrt, false),
@@ -877,6 +883,18 @@ special_fill_2pi_3 (mpfr_t res0, mpfr_t res1, fp_format format)
 }
 
 static size_t
+special_fill_2pi (mpfr_t res0, mpfr_t res1, fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  mpfr_const_pi (res0, MPFR_RNDU);
+  assert_exact (mpfr_mul_ui (res0, res0, 2, MPFR_RNDN));
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  mpfr_const_pi (res1, MPFR_RNDD);
+  assert_exact (mpfr_mul_ui (res1, res1, 2, MPFR_RNDN));
+  return 2;
+}
+
+static size_t
 special_fill_e (mpfr_t res0, mpfr_t res1, fp_format format)
 {
   mpfr_init2 (res0, fp_formats[format].mant_dig);
@@ -943,6 +961,7 @@ static const special_real_input special_real_inputs[] =
     { "-pi/6", special_fill_minus_pi_6 },
     { "pi/3", special_fill_pi_3 },
     { "2pi/3", special_fill_2pi_3 },
+    { "2pi", special_fill_2pi },
     { "e", special_fill_e },
     { "1/e", special_fill_1_e },
     { "e-1", special_fill_e_minus_1 },
@@ -1364,6 +1383,9 @@ calc_generic_results (generic_value *outputs, generic_value *inputs,
 		      const func_calc_desc *calc)
 {
   bool inexact;
+  int mpc_ternary;
+  mpc_t ci1, ci2, co;
+
   switch (calc->method)
     {
     case mpfr_f_f:
@@ -1428,13 +1450,12 @@ calc_generic_results (generic_value *outputs, generic_value *inputs,
       assert (inputs[1].type == gtype_fp);
       outputs[0].type = gtype_fp;
       mpfr_init (outputs[0].value.f);
-      mpc_t ci;
-      mpc_init2 (ci, internal_precision);
-      assert_exact (mpc_set_fr_fr (ci, inputs[0].value.f, inputs[1].value.f,
+      mpc_init2 (ci1, internal_precision);
+      assert_exact (mpc_set_fr_fr (ci1, inputs[0].value.f, inputs[1].value.f,
 				   MPC_RNDNN));
-      inexact = calc->func.mpc_c_f (outputs[0].value.f, ci, MPFR_RNDZ);
+      inexact = calc->func.mpc_c_f (outputs[0].value.f, ci1, MPFR_RNDZ);
       adjust_real (outputs[0].value.f, inexact);
-      mpc_clear (ci);
+      mpc_clear (ci1);
       break;
 
     case mpc_c_c:
@@ -1444,19 +1465,46 @@ calc_generic_results (generic_value *outputs, generic_value *inputs,
       mpfr_init (outputs[0].value.f);
       outputs[1].type = gtype_fp;
       mpfr_init (outputs[1].value.f);
-      mpc_t co;
-      mpc_init2 (ci, internal_precision);
+      mpc_init2 (ci1, internal_precision);
       mpc_init2 (co, internal_precision);
-      assert_exact (mpc_set_fr_fr (ci, inputs[0].value.f, inputs[1].value.f,
+      assert_exact (mpc_set_fr_fr (ci1, inputs[0].value.f, inputs[1].value.f,
+				   MPC_RNDNN));
+      mpc_ternary = calc->func.mpc_c_c (co, ci1, MPC_RNDZZ);
+      assert_exact (mpfr_set (outputs[0].value.f, mpc_realref (co),
+			      MPFR_RNDN));
+      assert_exact (mpfr_set (outputs[1].value.f, mpc_imagref (co),
+			      MPFR_RNDN));
+      adjust_real (outputs[0].value.f, MPC_INEX_RE (mpc_ternary));
+      adjust_real (outputs[1].value.f, MPC_INEX_IM (mpc_ternary));
+      mpc_clear (ci1);
+      mpc_clear (co);
+      break;
+
+    case mpc_cc_c:
+      assert (inputs[0].type == gtype_fp);
+      assert (inputs[1].type == gtype_fp);
+      assert (inputs[2].type == gtype_fp);
+      assert (inputs[3].type == gtype_fp);
+      outputs[0].type = gtype_fp;
+      mpfr_init (outputs[0].value.f);
+      outputs[1].type = gtype_fp;
+      mpfr_init (outputs[1].value.f);
+      mpc_init2 (ci1, internal_precision);
+      mpc_init2 (ci2, internal_precision);
+      mpc_init2 (co, internal_precision);
+      assert_exact (mpc_set_fr_fr (ci1, inputs[0].value.f, inputs[1].value.f,
+				   MPC_RNDNN));
+      assert_exact (mpc_set_fr_fr (ci2, inputs[2].value.f, inputs[3].value.f,
 				   MPC_RNDNN));
-      int mpc_ternary = calc->func.mpc_c_c (co, ci, MPC_RNDZZ);
+      mpc_ternary = calc->func.mpc_cc_c (co, ci1, ci2, MPC_RNDZZ);
       assert_exact (mpfr_set (outputs[0].value.f, mpc_realref (co),
 			      MPFR_RNDN));
       assert_exact (mpfr_set (outputs[1].value.f, mpc_imagref (co),
 			      MPFR_RNDN));
       adjust_real (outputs[0].value.f, MPC_INEX_RE (mpc_ternary));
       adjust_real (outputs[1].value.f, MPC_INEX_IM (mpc_ternary));
-      mpc_clear (ci);
+      mpc_clear (ci1);
+      mpc_clear (ci2);
       mpc_clear (co);
       break;
 
diff --git a/math/libm-test.inc b/math/libm-test.inc
index ee183ea..abe12db 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -6564,20 +6564,9 @@ cosh_test_upward (void)
 
 static const struct test_cc_c_data cpow_test_data[] =
   {
-    TEST_cc_c (cpow, 1, 0, 0, 0, 1.0, 0.0),
-    TEST_cc_c (cpow, 2, 0, 10, 0, 1024.0, 0.0),
-#if 0
-    /* Disabled until we fix bug 14473.  */
-    TEST_cc_c (cpow, M_El, 0, 0, 2 * M_PIl, 1.0, 0.0),
-#endif
-    TEST_cc_c (cpow, 2, 3, 4, 0, -119.0, -120.0),
-
     TEST_cc_c (cpow, qnan_value, qnan_value, qnan_value, qnan_value, qnan_value, qnan_value),
 
-    TEST_cc_c (cpow, 0.75L, 1.25L, 0.75L, 1.25L, 0.117506293914473555420279832210420483L, 0.346552747708338676483025352060418001L),
-    TEST_cc_c (cpow, 0.75L, 1.25L, 1.0L, 1.0L, 0.0846958290317209430433805274189191353L, 0.513285749182902449043287190519090481L),
-    TEST_cc_c (cpow, 0.75L, 1.25L, 1.0L, 0.0L, 0.75L, 1.25L),
-    TEST_cc_c (cpow, 0.75L, 1.25L, 0.0L, 1.0L, 0.331825439177608832276067945276730566L, 0.131338600281188544930936345230903032L),
+    AUTO_TESTS_cc_c (cpow, tonearest),
   };
 
 static void
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index ff70904..50bbe77 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -6886,6 +6886,55 @@ ldouble: 3
 Test "Imaginary part of: cpow (0.75 + 1.25 i, 1.0 + 1.0 i)":
 double: 1
 idouble: 1
+Test "Real part of: cpow (0x2p+0 + +0 i, 0xap+0 + +0 i)":
+ildouble: 1
+ldouble: 1
+Test "Real part of: cpow (0x2p+0 + 0x3p+0 i, 0x4p+0 + +0 i)":
+double: 1
+float: 5
+idouble: 1
+ifloat: 5
+ildouble: 1
+ldouble: 1
+Test "Imaginary part of: cpow (0x2p+0 + 0x3p+0 i, 0x4p+0 + +0 i)":
+float: 1
+ifloat: 1
+ildouble: 4
+ldouble: 4
+Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, +0 + 0x1p+0 i)":
+float: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, 0x1p+0 + +0 i)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, 0x1p+0 + 0x1p+0 i)":
+double: 2
+float: 4
+idouble: 2
+ifloat: 4
+ildouble: 3
+ldouble: 3
+Test "Imaginary part of: cpow (0xcp-4 + 0x1.4p+0 i, 0x1p+0 + 0x1p+0 i)":
+double: 1
+idouble: 1
+Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, 0xcp-4 + 0x1.4p+0 i)":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+ildouble: 1
+ldouble: 1
+Test "Imaginary part of: cpow (0xcp-4 + 0x1.4p+0 i, 0xcp-4 + 0x1.4p+0 i)":
+float: 1
+ifloat: 1
+ildouble: 2
+ldouble: 2
 Test "Real part of: cpow (2 + 0 i, 10 + 0 i)":
 ildouble: 1
 ldouble: 1
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index cad38a3..6ff7008 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -7759,6 +7759,46 @@ idouble: 2
 ifloat: 3
 ildouble: 3
 ldouble: 3
+Test "Real part of: cpow (0x2p+0 + +0 i, 0xap+0 + +0 i)":
+ildouble: 1
+ldouble: 1
+Test "Real part of: cpow (0x2p+0 + 0x3p+0 i, 0x4p+0 + +0 i)":
+double: 1
+float: 5
+idouble: 1
+ifloat: 5
+ildouble: 1
+ldouble: 1
+Test "Imaginary part of: cpow (0x2p+0 + 0x3p+0 i, 0x4p+0 + +0 i)":
+float: 2
+ifloat: 2
+ildouble: 4
+ldouble: 4
+Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, +0 + 0x1p+0 i)":
+float: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, 0x1p+0 + +0 i)":
+ildouble: 1
+ldouble: 1
+Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, 0x1p+0 + 0x1p+0 i)":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+ildouble: 3
+ldouble: 3
+Test "Real part of: cpow (0xcp-4 + 0x1.4p+0 i, 0xcp-4 + 0x1.4p+0 i)":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+ildouble: 1
+ldouble: 1
+Test "Imaginary part of: cpow (0xcp-4 + 0x1.4p+0 i, 0xcp-4 + 0x1.4p+0 i)":
+ildouble: 2
+ldouble: 2
 Test "Real part of: cpow (2 + 0 i, 10 + 0 i)":
 ildouble: 1
 ldouble: 1

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]