Module Name: src Committed By: dsl Date: Sun Mar 2 22:40:45 UTC 2014
Modified Files: src/tests/lib/libm: t_acos.c Log Message: Include the subtest number in any error output. Also temporarily print the rounding mode. I think that acos(-1) is ending up with the wrong sign because the test is being run with 'round towards -ve infinity' set. I think it getting set somewhere and causing this test to fail. The acos() code probably needs fixing - it shouldn't depend on the round mode like this. But first I want to know if this if the error. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/tests/lib/libm/t_acos.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libm/t_acos.c diff -u src/tests/lib/libm/t_acos.c:1.5 src/tests/lib/libm/t_acos.c:1.6 --- src/tests/lib/libm/t_acos.c:1.5 Sat Mar 1 21:08:39 2014 +++ src/tests/lib/libm/t_acos.c Sun Mar 2 22:40:45 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: t_acos.c,v 1.5 2014/03/01 21:08:39 dsl Exp $ */ +/* $NetBSD: t_acos.c,v 1.6 2014/03/02 22:40:45 dsl Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -31,29 +31,32 @@ #include <atf-c.h> #include <math.h> +#include <fenv.h> /* * Check result of fn(arg) is correct within the bounds. * Should be ok to do the checks using 'double' for 'float' functions. */ -#define T_LIBM_CHECK(fn, arg, expect, epsilon) do { \ +#define T_LIBM_CHECK(subtest, fn, arg, expect, epsilon) do { \ double r = fn(arg); \ double e = fabs(r - expect); \ if (e > epsilon) \ - atf_tc_fail_nonfatal(#fn "(%g) is %g not %g (error %g > %g)", \ - arg, r, expect, e, epsilon); \ + atf_tc_fail_nonfatal( \ + "subtest %zu: " #fn "(%g) is %g not %g (error %g > %g), roundmode %x", \ + subtest, arg, r, expect, e, epsilon, fegetround()); \ } while (0) /* Check that the result of fn(arg) is NaN */ #ifndef __vax__ -#define T_LIBM_CHECK_NAN(fn, arg) do { \ +#define T_LIBM_CHECK_NAN(subtest, fn, arg) do { \ double r = fn(arg); \ if (!isnan(r)) \ - atf_tc_fail_nonfatal(#fn "(%g) is %g not NaN", arg, r); \ + atf_tc_fail_nonfatal("subtest %zu: " #fn "(%g) is %g not NaN", \ + subtest, arg, r); \ } while (0) #else /* vax doesn't support NaN */ -#define T_LIBM_CHECK_NAN(fn, arg) (void)(arg) +#define T_LIBM_CHECK_NAN(subtest, fn, arg) (void)(arg) #endif #define AFT_LIBM_TEST(name, description) \ @@ -78,11 +81,11 @@ AFT_LIBM_TEST(acos_nan, "Test acos/acosf size_t i; for (i = 0; i < __arraycount(x); i++) { - T_LIBM_CHECK_NAN(acos, x[i]); + T_LIBM_CHECK_NAN(i, acos, x[i]); if (i < 2) /* Values are too small for float */ continue; - T_LIBM_CHECK_NAN(acosf, x[i]); + T_LIBM_CHECK_NAN(i, acosf, x[i]); } } @@ -104,14 +107,14 @@ AFT_LIBM_TEST(acos_inrange, "Test acos/a size_t i; /* - * Note that acos(x) might be calcualted as atan((1-x*x)/x). - * This means that acos(-1) is atan(-0.0), if the sign is lost - * the value will be 0 (atan(+0)) not M_PI. + * Note that acos(x) might be calculated as atan2(sqrt(1-x*x),x). + * This means that acos(-1) is atan2(+0,-1), if the sign is wrong + * the value will be -M_PI (atan2(-0,-1)) not M_PI. */ for (i = 0; i < __arraycount(values); i++) { - T_LIBM_CHECK(acos, values[i].x, values[i].y, 1.0e-15); - T_LIBM_CHECK(acosf, values[i].x, values[i].y, 1.0e-5); + T_LIBM_CHECK(i, acos, values[i].x, values[i].y, 1.0e-15); + T_LIBM_CHECK(i, acosf, values[i].x, values[i].y, 1.0e-5); } }