xref: /netbsd-src/tests/lib/libm/t_acos.c (revision a536ee5124e62c9a0051a252f7833dc8f50f44c9)
1 /* $NetBSD: t_acos.c,v 1.3 2012/03/23 23:45:31 matt 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(
142 			    "acos(cos(%0.03f)) != %0.03f (eps=%0.03e)",
143 			    x[i], x[i], fabs(y - x[i]));
144 	}
145 #endif
146 }
147 
148 /*
149  * acosf(3)
150  */
151 ATF_TC(acosf_nan);
152 ATF_TC_HEAD(acosf_nan, tc)
153 {
154 	atf_tc_set_md_var(tc, "descr", "Test acosf(NaN) == NaN");
155 }
156 
157 ATF_TC_BODY(acosf_nan, tc)
158 {
159 #ifndef __vax__
160 	const float x = 0.0L / 0.0L;
161 
162 	if (isnan(acosf(x)) == 0)
163 		atf_tc_fail_nonfatal("acosf(NaN) != NaN");
164 #endif
165 }
166 
167 ATF_TC(acosf_inf_neg);
168 ATF_TC_HEAD(acosf_inf_neg, tc)
169 {
170 	atf_tc_set_md_var(tc, "descr", "Test acosf(-Inf) == NaN");
171 }
172 
173 ATF_TC_BODY(acosf_inf_neg, tc)
174 {
175 #ifndef __vax__
176 	const float x = -1.0L / 0.0L;
177 
178 	if (isnan(acosf(x)) == 0)
179 		atf_tc_fail_nonfatal("acosf(-Inf) != NaN");
180 #endif
181 }
182 
183 ATF_TC(acosf_inf_pos);
184 ATF_TC_HEAD(acosf_inf_pos, tc)
185 {
186 	atf_tc_set_md_var(tc, "descr", "Test acosf(+Inf) == NaN");
187 }
188 
189 ATF_TC_BODY(acosf_inf_pos, tc)
190 {
191 #ifndef __vax__
192 	const float x = 1.0L / 0.0L;
193 
194 	if (isnan(acosf(x)) == 0)
195 		atf_tc_fail_nonfatal("acosf(+Inf) != NaN");
196 #endif
197 }
198 
199 ATF_TC(acosf_one_pos);
200 ATF_TC_HEAD(acosf_one_pos, tc)
201 {
202 	atf_tc_set_md_var(tc, "descr", "Test acosf(1.0) == +0.0");
203 }
204 
205 ATF_TC_BODY(acosf_one_pos, tc)
206 {
207 #ifndef __vax__
208 	const float y = acosf(1.0);
209 
210 	if (fabsf(y) > 0.0 || signbit(y) != 0)
211 		atf_tc_fail_nonfatal("acosf(1.0) != +0.0");
212 #endif
213 }
214 
215 ATF_TC(acosf_range);
216 ATF_TC_HEAD(acosf_range, tc)
217 {
218 	atf_tc_set_md_var(tc, "descr", "Test acosf(x) == NaN, x < -1, x > 1");
219 }
220 
221 ATF_TC_BODY(acosf_range, tc)
222 {
223 #ifndef __vax__
224 	const float x[] = { -1.1, -1.0000001, 1.1, 1.0000001 };
225 	size_t i;
226 
227 	for (i = 0; i < __arraycount(x); i++) {
228 
229 		if (isnan(acosf(x[i])) == 0)
230 			atf_tc_fail_nonfatal("acosf(%f) != NaN", x[i]);
231 	}
232 #endif
233 }
234 
235 ATF_TC(acosf_cosf);
236 ATF_TC_HEAD(acosf_cosf, tc)
237 {
238 	atf_tc_set_md_var(tc, "descr", "Test acosf(cosf(x)) == x");
239 }
240 
241 ATF_TC_BODY(acosf_cosf, tc)
242 {
243 #ifndef __vax__
244 	const float x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 };
245 	const float eps = 1.0e-5;
246 	float y;
247 	size_t i;
248 
249 	for (i = 0; i < __arraycount(x); i++) {
250 
251 		y = acosf(cosf(x[i]));
252 
253 		if (fabsf(y - x[i]) > eps)
254 			atf_tc_fail_nonfatal(
255 			    "acosf(cosf(%0.03f)) != %0.03f (eps=%0.03e)",
256 			    x[i], x[i], fabs(y - x[i]));
257 	}
258 #endif
259 }
260 
261 ATF_TP_ADD_TCS(tp)
262 {
263 
264 	ATF_TP_ADD_TC(tp, acos_nan);
265 	ATF_TP_ADD_TC(tp, acos_inf_neg);
266 	ATF_TP_ADD_TC(tp, acos_inf_pos);
267 	ATF_TP_ADD_TC(tp, acos_one_pos);
268 	ATF_TP_ADD_TC(tp, acos_range);
269 	ATF_TP_ADD_TC(tp, acos_cos);
270 
271 	ATF_TP_ADD_TC(tp, acosf_nan);
272 	ATF_TP_ADD_TC(tp, acosf_inf_neg);
273 	ATF_TP_ADD_TC(tp, acosf_inf_pos);
274 	ATF_TP_ADD_TC(tp, acosf_one_pos);
275 	ATF_TP_ADD_TC(tp, acosf_range);
276 	ATF_TP_ADD_TC(tp, acosf_cosf);
277 
278 	return atf_no_error();
279 }
280