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