xref: /netbsd-src/tests/lib/libm/t_acos.c (revision 9ddb6ab554e70fb9bbd90c3d96b812bc57755a14)
1 /* $NetBSD: t_acos.c,v 1.2 2011/09/18 04:48:38 jruoho Exp $ */
2 
3 /*-
4  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jukka Ruohonen.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <atf-c.h>
33 #include <math.h>
34 
35 /*
36  * acos(3)
37  */
38 ATF_TC(acos_nan);
39 ATF_TC_HEAD(acos_nan, tc)
40 {
41 	atf_tc_set_md_var(tc, "descr", "Test acos(NaN) == NaN");
42 }
43 
44 ATF_TC_BODY(acos_nan, tc)
45 {
46 #ifndef __vax__
47 	const double x = 0.0L / 0.0L;
48 
49 	if (isnan(acos(x)) == 0)
50 		atf_tc_fail_nonfatal("acos(NaN) != NaN");
51 #endif
52 }
53 
54 ATF_TC(acos_inf_neg);
55 ATF_TC_HEAD(acos_inf_neg, tc)
56 {
57 	atf_tc_set_md_var(tc, "descr", "Test acos(-Inf) == NaN");
58 }
59 
60 ATF_TC_BODY(acos_inf_neg, tc)
61 {
62 #ifndef __vax__
63 	const double x = -1.0L / 0.0L;
64 
65 	if (isnan(acos(x)) == 0)
66 		atf_tc_fail_nonfatal("acos(-Inf) != NaN");
67 #endif
68 }
69 
70 ATF_TC(acos_inf_pos);
71 ATF_TC_HEAD(acos_inf_pos, tc)
72 {
73 	atf_tc_set_md_var(tc, "descr", "Test acos(+Inf) == NaN");
74 }
75 
76 ATF_TC_BODY(acos_inf_pos, tc)
77 {
78 #ifndef __vax__
79 	const double x = 1.0L / 0.0L;
80 
81 	if (isnan(acos(x)) == 0)
82 		atf_tc_fail_nonfatal("acos(+Inf) != NaN");
83 #endif
84 }
85 
86 ATF_TC(acos_one_pos);
87 ATF_TC_HEAD(acos_one_pos, tc)
88 {
89 	atf_tc_set_md_var(tc, "descr", "Test acos(1.0) == +0.0");
90 }
91 
92 ATF_TC_BODY(acos_one_pos, tc)
93 {
94 #ifndef __vax__
95 	const double y = acos(1.0);
96 
97 	if (fabs(y) > 0.0 || signbit(y) != 0)
98 		atf_tc_fail_nonfatal("acos(1.0) != +0.0");
99 #endif
100 }
101 
102 ATF_TC(acos_range);
103 ATF_TC_HEAD(acos_range, tc)
104 {
105 	atf_tc_set_md_var(tc, "descr", "Test acos(x) == NaN, x < -1, x > 1");
106 }
107 
108 ATF_TC_BODY(acos_range, tc)
109 {
110 #ifndef __vax__
111 	const double x[] = { -1.1, -1.000000001, 1.1, 1.000000001 };
112 	size_t i;
113 
114 	for (i = 0; i < __arraycount(x); i++) {
115 
116 		if (isnan(acos(x[i])) == 0)
117 			atf_tc_fail_nonfatal("acos(%f) != NaN", x[i]);
118 	}
119 #endif
120 }
121 
122 ATF_TC(acos_cos);
123 ATF_TC_HEAD(acos_cos, tc)
124 {
125 	atf_tc_set_md_var(tc, "descr", "Test acos(cos(x)) == x");
126 }
127 
128 ATF_TC_BODY(acos_cos, tc)
129 {
130 #ifndef __vax__
131 	const double x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 };
132 	const double eps = 1.0e-15;
133 	double y;
134 	size_t i;
135 
136 	for (i = 0; i < __arraycount(x); i++) {
137 
138 		y = acos(cos(x[i]));
139 
140 		if (fabs(y - x[i]) > eps)
141 			atf_tc_fail_nonfatal("acos(cos(%0.03f)) != %0.03f",
142 			    x[i], x[i]);
143 	}
144 #endif
145 }
146 
147 /*
148  * acosf(3)
149  */
150 ATF_TC(acosf_nan);
151 ATF_TC_HEAD(acosf_nan, tc)
152 {
153 	atf_tc_set_md_var(tc, "descr", "Test acosf(NaN) == NaN");
154 }
155 
156 ATF_TC_BODY(acosf_nan, tc)
157 {
158 #ifndef __vax__
159 	const float x = 0.0L / 0.0L;
160 
161 	if (isnan(acosf(x)) == 0)
162 		atf_tc_fail_nonfatal("acosf(NaN) != NaN");
163 #endif
164 }
165 
166 ATF_TC(acosf_inf_neg);
167 ATF_TC_HEAD(acosf_inf_neg, tc)
168 {
169 	atf_tc_set_md_var(tc, "descr", "Test acosf(-Inf) == NaN");
170 }
171 
172 ATF_TC_BODY(acosf_inf_neg, tc)
173 {
174 #ifndef __vax__
175 	const float x = -1.0L / 0.0L;
176 
177 	if (isnan(acosf(x)) == 0)
178 		atf_tc_fail_nonfatal("acosf(-Inf) != NaN");
179 #endif
180 }
181 
182 ATF_TC(acosf_inf_pos);
183 ATF_TC_HEAD(acosf_inf_pos, tc)
184 {
185 	atf_tc_set_md_var(tc, "descr", "Test acosf(+Inf) == NaN");
186 }
187 
188 ATF_TC_BODY(acosf_inf_pos, tc)
189 {
190 #ifndef __vax__
191 	const float x = 1.0L / 0.0L;
192 
193 	if (isnan(acosf(x)) == 0)
194 		atf_tc_fail_nonfatal("acosf(+Inf) != NaN");
195 #endif
196 }
197 
198 ATF_TC(acosf_one_pos);
199 ATF_TC_HEAD(acosf_one_pos, tc)
200 {
201 	atf_tc_set_md_var(tc, "descr", "Test acosf(1.0) == +0.0");
202 }
203 
204 ATF_TC_BODY(acosf_one_pos, tc)
205 {
206 #ifndef __vax__
207 	const float y = acosf(1.0);
208 
209 	if (fabsf(y) > 0.0 || signbit(y) != 0)
210 		atf_tc_fail_nonfatal("acosf(1.0) != +0.0");
211 #endif
212 }
213 
214 ATF_TC(acosf_range);
215 ATF_TC_HEAD(acosf_range, tc)
216 {
217 	atf_tc_set_md_var(tc, "descr", "Test acosf(x) == NaN, x < -1, x > 1");
218 }
219 
220 ATF_TC_BODY(acosf_range, tc)
221 {
222 #ifndef __vax__
223 	const float x[] = { -1.1, -1.0000001, 1.1, 1.0000001 };
224 	size_t i;
225 
226 	for (i = 0; i < __arraycount(x); i++) {
227 
228 		if (isnan(acosf(x[i])) == 0)
229 			atf_tc_fail_nonfatal("acosf(%f) != NaN", x[i]);
230 	}
231 #endif
232 }
233 
234 ATF_TC(acosf_cosf);
235 ATF_TC_HEAD(acosf_cosf, tc)
236 {
237 	atf_tc_set_md_var(tc, "descr", "Test acosf(cosf(x)) == x");
238 }
239 
240 ATF_TC_BODY(acosf_cosf, tc)
241 {
242 #ifndef __vax__
243 	const float x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 };
244 	const float eps = 1.0e-5;
245 	float y;
246 	size_t i;
247 
248 	for (i = 0; i < __arraycount(x); i++) {
249 
250 		y = acosf(cosf(x[i]));
251 
252 		if (fabsf(y - x[i]) > eps)
253 			atf_tc_fail_nonfatal("acosf(cosf(%0.03f)) != %0.03f",
254 			    x[i], x[i]);
255 	}
256 #endif
257 }
258 
259 ATF_TP_ADD_TCS(tp)
260 {
261 
262 	ATF_TP_ADD_TC(tp, acos_nan);
263 	ATF_TP_ADD_TC(tp, acos_inf_neg);
264 	ATF_TP_ADD_TC(tp, acos_inf_pos);
265 	ATF_TP_ADD_TC(tp, acos_one_pos);
266 	ATF_TP_ADD_TC(tp, acos_range);
267 	ATF_TP_ADD_TC(tp, acos_cos);
268 
269 	ATF_TP_ADD_TC(tp, acosf_nan);
270 	ATF_TP_ADD_TC(tp, acosf_inf_neg);
271 	ATF_TP_ADD_TC(tp, acosf_inf_pos);
272 	ATF_TP_ADD_TC(tp, acosf_one_pos);
273 	ATF_TP_ADD_TC(tp, acosf_range);
274 	ATF_TP_ADD_TC(tp, acosf_cosf);
275 
276 	return atf_no_error();
277 }
278