This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Test cpow in all rounding modes
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Tue, 10 Jun 2014 23:01:53 +0000
- Subject: Test cpow in all rounding modes
- Authentication-results: sourceware.org; auth=none
This patch enables testing of cpow in all rounding modes using
ALL_RM_TEST. There were two reasons this was previously deferred:
* MPC has complicated rounding-mode-dependent rules for the signs of
exact zero real or imaginary parts in the result of mpc_pow. Annex
G does not impose any such requirements and I don't think glibc
should try to implement any particular logic here. This patch adds
support for gen-auto-libm-tests passing the IGNORE_ZERO_INF_SIGN
flag to libm-test.inc.
* Error accumulations in some tests in non-default rounding modes
exceed the maximum error permitted in libm-test.inc. This patch
marks the problem tests with xfail-rounding. (It might be possible
to reduce the accumulations a bit by using round-to-nearest when
cpow calls clog, but I don't think there's much point; the
implementation approach for cpow is fundamentally deficient, as
discussed in the existing bug for cpow inaccuracy which can
reasonably be considered to cover these less-inaccurate cases as
well. It's possible that the test "cpow 2 0 10 0" will also need
xfail-rounding on some platforms.)
Tested x86_64 and x86 and ulps updated accordingly.
(auto-libm-test-out diffs omitted below.)
2014-06-10 Joseph Myers <joseph@codesourcery.com>
* math/gen-auto-libm-tests.c: Document use of
ignore-zero-inf-sign.
(input_flag_type): Add value flag_ignore_zero_inf_sign.
(input_flags): Add ignore-zero-inf-sign.
(output_for_one_input_case): Handle flag_ignore_zero_inf_sign.
* math/gen-libm-test.pl (generate_testfile): Handle
ignore-zero-inf-sign.
* math/auto-libm-test-in: Mark some cpow tests with
ignore-zero-inf-sign and some with xfail-rounding.
* math/auto-libm-test-out: Regenerated.
* math/libm-test.inc (cpow_test): Use ALL_RM_TEST.
* 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 6edad5a..bfbc085 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -652,14 +652,14 @@ cosh 0x2.c5d37700c6bb03a6c24b6c9b494ep+12 no-test-inline xfail-rounding:ldbl-128
cosh -0x2.c5d37700c6bb03a6c24b6c9b494cp+12 no-test-inline xfail-rounding:ldbl-128ibm
cosh -0x2.c5d37700c6bb03a6c24b6c9b494ep+12 no-test-inline xfail-rounding:ldbl-128ibm
-cpow 1 0 0 0
-cpow 2 0 10 0
+cpow 1 0 0 0 ignore-zero-inf-sign
+cpow 2 0 10 0 ignore-zero-inf-sign
# Bug 14473: cpow results inaccurate.
cpow e 0 0 2pi xfail
-cpow 2 3 4 0
+cpow 2 3 4 0 xfail-rounding
-cpow 0.75 1.25 0.75 1.25
-cpow 0.75 1.25 1.0 1.0
+cpow 0.75 1.25 0.75 1.25 xfail-rounding
+cpow 0.75 1.25 1.0 1.0 xfail-rounding
cpow 0.75 1.25 1.0 0.0
cpow 0.75 1.25 0.0 1.0
diff --git a/math/gen-auto-libm-tests.c b/math/gen-auto-libm-tests.c
index 132cca2..12c530a 100644
--- a/math/gen-auto-libm-tests.c
+++ b/math/gen-auto-libm-tests.c
@@ -84,15 +84,16 @@
permitted), errno is expected to be left unchanged.
The flag "no-test-inline" indicates a test is disabled for inline
- function testing; "xfail" indicates the test is disabled as
- expected to produce incorrect results, "xfail-rounding" indicates
- the test is disabled only in rounding modes other than
- round-to-nearest. Otherwise, test flags are of the form
- "spurious-<exception>" and "missing-<exception>", for any exception
- ("overflow", "underflow", "inexact", "invalid", "divbyzero"),
- "spurious-errno" and "missing-errno", to indicate when tests are
- expected to deviate from the exception and errno settings
- corresponding to the mathematical results. "xfail",
+ function testing; "ignore-zero-inf-sign" indicates the the signs of
+ zero and infinite results should be ignored; "xfail" indicates the
+ test is disabled as expected to produce incorrect results,
+ "xfail-rounding" indicates the test is disabled only in rounding
+ modes other than round-to-nearest. Otherwise, test flags are of
+ the form "spurious-<exception>" and "missing-<exception>", for any
+ exception ("overflow", "underflow", "inexact", "invalid",
+ "divbyzero"), "spurious-errno" and "missing-errno", to indicate
+ when tests are expected to deviate from the exception and errno
+ settings corresponding to the mathematical results. "xfail",
"xfail-rounding", "spurious-" and "missing-" flags should be
accompanied by a comment referring to an open bug in glibc
Bugzilla.
@@ -109,17 +110,17 @@
plus_infty or minus_infty for infinite expected results, or as
integer constant expressions (not necessarily with the right type)
or IGNORE for integer inputs and outputs. Flags are
- "no-test-inline", "xfail", "<exception>", "<exception>-ok",
- "errno-<value>", "errno-<value>-ok", which may be unconditional or
- conditional. "<exception>" indicates that a correct result means
- the given exception should be raised. "errno-<value>" indicates
- that a correct result means errno should be set to the given value.
- "-ok" means not to test for the given exception or errno value
- (whether because it was marked as possibly missing or spurious, or
- because the calculation of correct results indicated it was
- optional). Conditions "before-rounding" and "after-rounding"
- indicate tests where expectations for underflow exceptions depend
- on how the architecture detects tininess. */
+ "no-test-inline", "ignore-zero-info-sign", "xfail", "<exception>",
+ "<exception>-ok", "errno-<value>", "errno-<value>-ok", which may be
+ unconditional or conditional. "<exception>" indicates that a
+ correct result means the given exception should be raised.
+ "errno-<value>" indicates that a correct result means errno should
+ be set to the given value. "-ok" means not to test for the given
+ exception or errno value (whether because it was marked as possibly
+ missing or spurious, or because the calculation of correct results
+ indicated it was optional). Conditions "before-rounding" and
+ "after-rounding" indicate tests where expectations for underflow
+ exceptions depend on how the architecture detects tininess. */
#define _GNU_SOURCE
@@ -315,6 +316,7 @@ typedef struct
typedef enum
{
flag_no_test_inline,
+ flag_ignore_zero_inf_sign,
flag_xfail,
flag_xfail_rounding,
/* The "spurious" and "missing" flags must be in the same order as
@@ -342,6 +344,7 @@ typedef enum
static const char *const input_flags[num_input_flag_types] =
{
"no-test-inline",
+ "ignore-zero-inf-sign",
"xfail",
"xfail-rounding",
"spurious-divbyzero",
@@ -1950,6 +1953,7 @@ output_for_one_input_case (FILE *fp, const char *filename, test_function *tf,
switch (it->flags[i].type)
{
case flag_no_test_inline:
+ case flag_ignore_zero_inf_sign:
case flag_xfail:
if (fprintf (fp, " %s%s",
input_flags[it->flags[i].type],
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index 5f62872..b5d599f 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -442,6 +442,10 @@ sub generate_testfile {
}
}
$flags_conv = "";
+ if (defined ($flag_cond{"ignore-zero-inf-sign"})) {
+ $flags_conv .= or_cond_value ($flag_cond{"ignore-zero-inf-sign"},
+ "IGNORE_ZERO_INF_SIGN", "0");
+ }
if (defined ($flag_cond{"no-test-inline"})) {
$flags_conv .= or_cond_value ($flag_cond{"no-test-inline"},
"NO_TEST_INLINE", "0");
diff --git a/math/libm-test.inc b/math/libm-test.inc
index fa8e238..05febc5 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -6288,9 +6288,7 @@ static const struct test_cc_c_data cpow_test_data[] =
static void
cpow_test (void)
{
- START (cpow, 0);
- RUN_TEST_LOOP_cc_c (cpow, cpow_test_data, );
- END_COMPLEX;
+ ALL_RM_TEST (cpow, 0, cpow_test_data, RUN_TEST_LOOP_cc_c, END_COMPLEX);
}
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index d7424a6..d0dc821 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -916,6 +916,54 @@ ifloat: 1
ildouble: 4
ldouble: 4
+Function: Real part of "cpow_downward":
+double: 5
+float: 8
+idouble: 5
+ifloat: 8
+ildouble: 7
+ldouble: 7
+
+Function: Imaginary part of "cpow_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 2
+ldouble: 2
+
+Function: Real part of "cpow_towardzero":
+double: 5
+float: 8
+idouble: 5
+ifloat: 8
+ildouble: 7
+ldouble: 7
+
+Function: Imaginary part of "cpow_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+
+Function: Real part of "cpow_upward":
+double: 4
+float: 1
+idouble: 4
+ifloat: 1
+ildouble: 2
+ldouble: 2
+
+Function: Imaginary part of "cpow_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 2
+ldouble: 2
+
Function: Real part of "csin":
double: 1
float: 1
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index 92fef5a..dbe9c46 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -959,6 +959,54 @@ ifloat: 2
ildouble: 4
ldouble: 4
+Function: Real part of "cpow_downward":
+double: 4
+float: 8
+idouble: 4
+ifloat: 8
+ildouble: 7
+ldouble: 7
+
+Function: Imaginary part of "cpow_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 2
+ldouble: 2
+
+Function: Real part of "cpow_towardzero":
+double: 4
+float: 8
+idouble: 4
+ifloat: 8
+ildouble: 7
+ldouble: 7
+
+Function: Imaginary part of "cpow_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 1
+ldouble: 1
+
+Function: Real part of "cpow_upward":
+double: 4
+float: 1
+idouble: 4
+ifloat: 1
+ildouble: 2
+ldouble: 2
+
+Function: Imaginary part of "cpow_upward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+ildouble: 2
+ldouble: 2
+
Function: Real part of "csin":
double: 1
float: 1
--
Joseph S. Myers
joseph@codesourcery.com