xref: /netbsd-src/tests/lib/libm/t_bit.c (revision 557aa1ae1a09af71f042c386f707172e096da19f)
1*557aa1aeSriastradh /*	$NetBSD: t_bit.c,v 1.2 2024/05/06 18:41:23 riastradh Exp $	*/
2ff9d8a09Smaya 
3ff9d8a09Smaya /*
4ff9d8a09Smaya  * Written by Maya Rashish <maya@NetBSD.org>
5ff9d8a09Smaya  * Public domain.
6ff9d8a09Smaya  *
7ff9d8a09Smaya  * Testing signbit{,f,l} function correctly
8ff9d8a09Smaya  */
9ff9d8a09Smaya 
10*557aa1aeSriastradh #include <sys/cdefs.h>
11*557aa1aeSriastradh __RCSID("$NetBSD: t_bit.c,v 1.2 2024/05/06 18:41:23 riastradh Exp $");
12*557aa1aeSriastradh 
13ff9d8a09Smaya #include <atf-c.h>
14ff9d8a09Smaya #include <float.h>
15ff9d8a09Smaya #include <math.h>
16ff9d8a09Smaya #include <stdio.h>
17ff9d8a09Smaya #include <stdint.h>
18ff9d8a09Smaya #include <stdbool.h>
19ff9d8a09Smaya 
20ff9d8a09Smaya static const struct {
21ff9d8a09Smaya 	double input;
22ff9d8a09Smaya 	bool is_negative;
23ff9d8a09Smaya } values[] = {
24ff9d8a09Smaya 	{ -1,		true },
25ff9d8a09Smaya 	{ -123,		true },
26ff9d8a09Smaya 	{ -123E6,	true },
27ff9d8a09Smaya 	{ -INFINITY,	true },
28ff9d8a09Smaya 	{ INFINITY,	false },
29ff9d8a09Smaya 	{ 123E6,	false },
30ff9d8a09Smaya 	{ 0,		false },
31*557aa1aeSriastradh 	{ -0.,		true },
32ff9d8a09Smaya 	{ -FLT_MIN,	true },
33ff9d8a09Smaya 	{ FLT_MIN,	false },
34ff9d8a09Smaya 	/*
35ff9d8a09Smaya 	 * Cannot be accurately represented as float,
36ff9d8a09Smaya 	 * but sign should be preserved
37ff9d8a09Smaya 	 */
38ff9d8a09Smaya 	{ DBL_MAX,	false },
39ff9d8a09Smaya 	{ -DBL_MAX,	true },
40ff9d8a09Smaya };
41ff9d8a09Smaya 
42ff9d8a09Smaya static const struct {
43ff9d8a09Smaya 	long double input;
44ff9d8a09Smaya 	bool is_negative;
45ff9d8a09Smaya } ldbl_values[] = {
46ff9d8a09Smaya 	{ -LDBL_MIN,	true },
47ff9d8a09Smaya 	{ LDBL_MIN,	false },
48ff9d8a09Smaya 	{ LDBL_MAX,	false },
49ff9d8a09Smaya 	{ -LDBL_MAX,	true },
50ff9d8a09Smaya };
51ff9d8a09Smaya 
52ff9d8a09Smaya ATF_TC(signbit);
ATF_TC_HEAD(signbit,tc)53ff9d8a09Smaya ATF_TC_HEAD(signbit, tc)
54ff9d8a09Smaya {
55*557aa1aeSriastradh 	atf_tc_set_md_var(tc, "descr",
56*557aa1aeSriastradh 	    "Check that signbit functions correctly");
57ff9d8a09Smaya }
58ff9d8a09Smaya 
ATF_TC_BODY(signbit,tc)59ff9d8a09Smaya ATF_TC_BODY(signbit, tc)
60ff9d8a09Smaya {
61*557aa1aeSriastradh 	unsigned i;
62ff9d8a09Smaya 
63*557aa1aeSriastradh 	for (i = 0; i < __arraycount(values); i++) {
64*557aa1aeSriastradh 		const float iterator_f = values[i].input;
65*557aa1aeSriastradh 		const double iterator_d = values[i].input;
66*557aa1aeSriastradh 		const long double iterator_l = values[i].input;
67*557aa1aeSriastradh 
68*557aa1aeSriastradh 		if (signbit(iterator_f) != values[i].is_negative) {
69ff9d8a09Smaya 			atf_tc_fail("%s:%d iteration %d signbitf is wrong"
70*557aa1aeSriastradh 			    " about the sign of %f", __func__, __LINE__, i,
71*557aa1aeSriastradh 			    iterator_f);
72*557aa1aeSriastradh 		}
73*557aa1aeSriastradh 		if (signbit(iterator_d) != values[i].is_negative) {
74ff9d8a09Smaya 			atf_tc_fail("%s:%d iteration %d signbit is wrong"
75*557aa1aeSriastradh 			    "about the sign of %f", __func__, __LINE__, i,
76*557aa1aeSriastradh 			    iterator_d);
77*557aa1aeSriastradh 		}
78*557aa1aeSriastradh 		if (signbit(iterator_l) != values[i].is_negative) {
79ff9d8a09Smaya 			atf_tc_fail("%s:%d iteration %d signbitl is wrong"
80*557aa1aeSriastradh 			    " about the sign of %Lf", __func__, __LINE__, i,
81*557aa1aeSriastradh 			    iterator_l);
82*557aa1aeSriastradh 		}
83ff9d8a09Smaya 	}
84ff9d8a09Smaya 
85*557aa1aeSriastradh 	for (i = 0; i < __arraycount(ldbl_values); i++) {
86*557aa1aeSriastradh 		if (signbit(ldbl_values[i].input) !=
87*557aa1aeSriastradh 		    ldbl_values[i].is_negative) {
88ff9d8a09Smaya 			atf_tc_fail("%s:%d iteration %d signbitl is"
89ff9d8a09Smaya 			    "wrong about the sign of %Lf",
90ff9d8a09Smaya 			    __func__, __LINE__, i,
91ff9d8a09Smaya 			    ldbl_values[i].input);
92ff9d8a09Smaya 		}
93*557aa1aeSriastradh 	}
94ff9d8a09Smaya 
95*557aa1aeSriastradh #ifdef NAN
96*557aa1aeSriastradh 	ATF_CHECK_EQ(signbit(copysignf(NAN, -1)), true);
97*557aa1aeSriastradh 	ATF_CHECK_EQ(signbit(copysignf(NAN, +1)), false);
98*557aa1aeSriastradh 	ATF_CHECK_EQ(signbit(copysign(NAN, -1)), true);
99*557aa1aeSriastradh 	ATF_CHECK_EQ(signbit(copysign(NAN, +1)), false);
100*557aa1aeSriastradh 	ATF_CHECK_EQ(signbit(copysignl(NAN, -1)), true);
101*557aa1aeSriastradh 	ATF_CHECK_EQ(signbit(copysignl(NAN, +1)), false);
102*557aa1aeSriastradh #endif
103ff9d8a09Smaya }
104ff9d8a09Smaya 
ATF_TP_ADD_TCS(tp)105ff9d8a09Smaya ATF_TP_ADD_TCS(tp)
106ff9d8a09Smaya {
107ff9d8a09Smaya 
108ff9d8a09Smaya 	ATF_TP_ADD_TC(tp, signbit);
109ff9d8a09Smaya 
110ff9d8a09Smaya 	return atf_no_error();
111ff9d8a09Smaya }
112