t_acos.c revision 1.3
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 */
38ATF_TC(acos_nan);
39ATF_TC_HEAD(acos_nan, tc)
40{
41	atf_tc_set_md_var(tc, "descr", "Test acos(NaN) == NaN");
42}
43
44ATF_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
54ATF_TC(acos_inf_neg);
55ATF_TC_HEAD(acos_inf_neg, tc)
56{
57	atf_tc_set_md_var(tc, "descr", "Test acos(-Inf) == NaN");
58}
59
60ATF_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
70ATF_TC(acos_inf_pos);
71ATF_TC_HEAD(acos_inf_pos, tc)
72{
73	atf_tc_set_md_var(tc, "descr", "Test acos(+Inf) == NaN");
74}
75
76ATF_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
86ATF_TC(acos_one_pos);
87ATF_TC_HEAD(acos_one_pos, tc)
88{
89	atf_tc_set_md_var(tc, "descr", "Test acos(1.0) == +0.0");
90}
91
92ATF_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
102ATF_TC(acos_range);
103ATF_TC_HEAD(acos_range, tc)
104{
105	atf_tc_set_md_var(tc, "descr", "Test acos(x) == NaN, x < -1, x > 1");
106}
107
108ATF_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
122ATF_TC(acos_cos);
123ATF_TC_HEAD(acos_cos, tc)
124{
125	atf_tc_set_md_var(tc, "descr", "Test acos(cos(x)) == x");
126}
127
128ATF_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 */
151ATF_TC(acosf_nan);
152ATF_TC_HEAD(acosf_nan, tc)
153{
154	atf_tc_set_md_var(tc, "descr", "Test acosf(NaN) == NaN");
155}
156
157ATF_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
167ATF_TC(acosf_inf_neg);
168ATF_TC_HEAD(acosf_inf_neg, tc)
169{
170	atf_tc_set_md_var(tc, "descr", "Test acosf(-Inf) == NaN");
171}
172
173ATF_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
183ATF_TC(acosf_inf_pos);
184ATF_TC_HEAD(acosf_inf_pos, tc)
185{
186	atf_tc_set_md_var(tc, "descr", "Test acosf(+Inf) == NaN");
187}
188
189ATF_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
199ATF_TC(acosf_one_pos);
200ATF_TC_HEAD(acosf_one_pos, tc)
201{
202	atf_tc_set_md_var(tc, "descr", "Test acosf(1.0) == +0.0");
203}
204
205ATF_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
215ATF_TC(acosf_range);
216ATF_TC_HEAD(acosf_range, tc)
217{
218	atf_tc_set_md_var(tc, "descr", "Test acosf(x) == NaN, x < -1, x > 1");
219}
220
221ATF_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
235ATF_TC(acosf_cosf);
236ATF_TC_HEAD(acosf_cosf, tc)
237{
238	atf_tc_set_md_var(tc, "descr", "Test acosf(cosf(x)) == x");
239}
240
241ATF_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
261ATF_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