summary refs log tree commit diff
path: root/math
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-01-19 21:42:58 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-01-19 21:42:58 +0000
commit2e3d0de31f2020fbf358b932db18b8c44e2c92d0 (patch)
tree6eb794364583af8bde33a78e47ac0d8311b1194e /math
parentdf782dc690775d93b0cc1076655a9b92b5a44ad0 (diff)
downloadglibc-2e3d0de31f2020fbf358b932db18b8c44e2c92d0.tar.gz
glibc-2e3d0de31f2020fbf358b932db18b8c44e2c92d0.tar.xz
glibc-2e3d0de31f2020fbf358b932db18b8c44e2c92d0.zip
Fix ulps regeneration for *-finite tests.
On running tests after from-scratch ulps regeneration, I found that
some libm tests failed with ulps in excess of those recorded in the
from-scratch regeneration, which should never happen unless those ulps
exceed the limit on ulps that can go in libm-test-ulps files.

Failure: Test: atan2_upward (inf, -inf)
Result:
 is:          2.35619498e+00   0x1.2d97ccp+1
 should be:   2.35619450e+00   0x1.2d97c8p+1
 difference:  4.76837159e-07   0x1.000000p-21
 ulp       :  2.0000
 max.ulp   :  1.0000
Maximal error of `atan2_upward'
 is      : 2 ulp
 accepted: 1 ulp
Failure: Test: carg_upward (-inf + inf i)
Result:
 is:          2.35619498e+00   0x1.2d97ccp+1
 should be:   2.35619450e+00   0x1.2d97c8p+1
 difference:  4.76837159e-07   0x1.000000p-21
 ulp       :  2.0000
 max.ulp   :  1.0000
Maximal error of `carg_upward'
 is      : 2 ulp
 accepted: 1 ulp

The problem comes from the addition of tests for the finite-math-only
versions of libm functions.  Those tests share ulps with the default
function variants.  make regen-ulps runs the default tests before the
finite-math-only tests, concatenating the resulting ulps before
feeding them to gen-libm-test.pl to generate a new libm-test-ulps
file.  But gen-libm-test.pl always takes the last ulps value given for
any (function, type) pair.  So, if the largest ulps for a function
come from non-finite inputs, a from-scratch regeneration loses those
ulps.

This patch fixes gen-libm-test.pl, in the case where there are
multiple ulps values for a (function, type) pair - which can only
happen as part of a regeneration - to take the largest ulps value
rather than the last one.

Tested for ARM / MIPS / powerpc-nofpu.

	* math/gen-libm-test.pl (parse_ulps): Do not reduce
	already-recorded ulps.
	* sysdeps/arm/libm-test-ulps: Regenerated.
	* sysdeps/mips/mips32/libm-test-ulps: Likewise.
	* sysdeps/mips/mips64/libm-test-ulps: Likewise.
	* sysdeps/powerpc/nofpu/libm-test-ulps: Likewise.
Diffstat (limited to 'math')
-rwxr-xr-xmath/gen-libm-test.pl7
1 files changed, 5 insertions, 2 deletions
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index eb1c29956d..17f17f7493 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -583,8 +583,11 @@ sub parse_ulps {
 	# ignore
 	next;
       } else {
-	$results{$test}{$type}{'ulp'}{$float} = $eps;
-	$results{$test}{'has_ulps'} = 1;
+	if (!defined ($results{$test}{$type}{'ulp'}{$float})
+	    || $results{$test}{$type}{'ulp'}{$float} < $eps) {
+	  $results{$test}{$type}{'ulp'}{$float} = $eps;
+	  $results{$test}{'has_ulps'} = 1;
+	}
       }
       if ($type =~ /^real|imag$/) {
 	$results{$test}{'type'} = 'complex';