]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/netbsd-tests/lib/libm/t_libm.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / netbsd-tests / lib / libm / t_libm.h
1 /* $NetBSD: t_libm.h,v 1.6 2014/03/25 17:30:14 joerg Exp $ */
2
3 /*
4  * Check result of fn(arg) is correct within the bounds.
5  * Should be ok to do the checks using 'double' for 'float' functions.
6  * On i386 float and double values are returned on the x87 stack and might
7  * be out of range for the function - so save and print as 'long double'.
8  * (otherwise you can get 'inf != inf' reported!)
9  */
10 #define T_LIBM_CHECK(subtest, fn, arg, expect_, epsilon_) do { \
11         long double epsilon = epsilon_; \
12         long double expect = expect_; \
13         long double r = fn(arg); \
14         long double e = fabsl(r - expect); \
15         if (r != expect && e > epsilon) \
16                 atf_tc_fail_nonfatal( \
17                     "subtest %u: " #fn "(%g) is %Lg (%.14La) " \
18                     "not %Lg (%.13La), error %Lg (%.6La) > %Lg", \
19                     subtest, arg, r, r, expect, expect, e, e, epsilon); \
20     } while (0)
21
22 /* Check that the result of fn(arg) is NaN */
23 #ifndef __vax__
24 #define T_LIBM_CHECK_NAN(subtest, fn, arg) do { \
25         double r = fn(arg); \
26         if (!isnan(r)) \
27                 atf_tc_fail_nonfatal("subtest %u: " #fn "(%g) is %g not NaN", \
28                     subtest, arg, r); \
29     } while (0)
30 #else
31 /* vax doesn't support NaN */
32 #define T_LIBM_CHECK_NAN(subtest, fn, arg) (void)(arg)
33 #endif
34
35 /* Check that the result of fn(arg) is +0.0 */
36 #define T_LIBM_CHECK_PLUS_ZERO(subtest, fn, arg) do { \
37         double r = fn(arg); \
38         if (fabs(r) > 0.0 || signbit(r) != 0) \
39                 atf_tc_fail_nonfatal("subtest %u: " #fn "(%g) is %g not +0.0", \
40                     subtest, arg, r); \
41     } while (0)
42
43 /* Check that the result of fn(arg) is -0.0 */
44 #define T_LIBM_CHECK_MINUS_ZERO(subtest, fn, arg) do { \
45         double r = fn(arg); \
46         if (fabs(r) > 0.0 || signbit(r) == 0) \
47                 atf_tc_fail_nonfatal("subtest %u: " #fn "(%g) is %g not -0.0", \
48                     subtest, arg, r); \
49     } while (0)
50
51 /* Some useful constants (for test vectors) */
52 #ifndef __vax__ /* no NAN nor +/- INF on vax */
53 #define T_LIBM_NAN      (0.0 / 0.0)
54 #define T_LIBM_PLUS_INF (+1.0 / 0.0)
55 #define T_LIBM_MINUS_INF (-1.0 / 0.0)
56 #endif
57
58 /* One line definition of a simple test */
59 #define ATF_LIBM_TEST(name, description) \
60 ATF_TC(name); \
61 ATF_TC_HEAD(name, tc) { atf_tc_set_md_var(tc, "descr", description); } \
62 ATF_TC_BODY(name, tc)