From 45adef3cf2057aa1f7e2b7479e5f1bcb7506140c Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 4 Mar 2014 14:16:25 +0000 Subject: Fix libm-test.inc:print_complex_max_error handling of some error cases. When regenerating ulps incrementally with "make regen-ulps", the resulting diffs should only increase existing ulps, never decrease them. This allows successive uses of "make regen-ulps" on different hardware or with different compiler configurations to accumulate ulps that are sufficient for tests to pass in a variety of configurations. However, sometimes changes that decrease ulps are wrongly generated; thus, when applying I had to remove such changes manually. The problem is print_complex_max_error. If the ulps for either the real or the imaginary part of a function are out of range, this function prints the maximum ulps seen for both parts, which then replace those previously in libm-test-ulps. So if the ulps for one part are bigger than recorded before, but those for the other part are smaller, the diffs reduce existing ulps. This patch fixes the logic so that only increased ulps get printed. Tested x86_64 ("make math/tests", and "make regen-ulps" in a situation with ulps manually modified so one part would go up and the other down, to confirm the changes have the intended effect then). * math/libm-test.inc (print_complex_max_error): Check separately whether real and imaginary errors are within allowed range and pass 0 to print_complex_function_ulps instead of value within allowed range. --- math/libm-test.inc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'math/libm-test.inc') diff --git a/math/libm-test.inc b/math/libm-test.inc index 371229238d..4cb239f12a 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -568,19 +568,26 @@ static void print_complex_max_error (const char *func_name) { __complex__ FLOAT allowed = find_complex_function_ulps (func_name); - int ok = 0; + int real_ok = 0, imag_ok = 0, ok; - if ((real_max_error == 0 && imag_max_error == 0) - || (real_max_error <= __real__ allowed - && imag_max_error <= __imag__ allowed - && !ignore_max_ulp)) + if (real_max_error == 0 + || (real_max_error <= __real__ allowed && !ignore_max_ulp)) { - ok = 1; + real_ok = 1; } - if (!ok) - print_complex_function_ulps (func_name, real_max_error, imag_max_error); + if (imag_max_error == 0 + || (imag_max_error <= __imag__ allowed && !ignore_max_ulp)) + { + imag_ok = 1; + } + + ok = real_ok && imag_ok; + if (!ok) + print_complex_function_ulps (func_name, + real_ok ? 0 : real_max_error, + imag_ok ? 0 : imag_max_error); if (print_screen_max_error (ok)) { -- cgit 1.4.1