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