t_atan.c revision 1.1 1 /* $NetBSD: t_atan.c,v 1.1 2011/09/17 18:08:35 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 * atan(3)
37 */
38 ATF_TC(atan_nan);
39 ATF_TC_HEAD(atan_nan, tc)
40 {
41 atf_tc_set_md_var(tc, "descr", "Test atan(NaN) == NaN");
42 }
43
44 ATF_TC_BODY(atan_nan, tc)
45 {
46 #ifndef __vax__
47 const double x = 0.0L / 0.0L;
48
49 if (isnan(atan(x)) == 0)
50 atf_tc_fail_nonfatal("atan(NaN) != NaN");
51 #endif
52 }
53
54 ATF_TC(atan_inf_neg);
55 ATF_TC_HEAD(atan_inf_neg, tc)
56 {
57 atf_tc_set_md_var(tc, "descr", "Test atan(-Inf) == -pi/2");
58 }
59
60 ATF_TC_BODY(atan_inf_neg, tc)
61 {
62 #ifndef __vax__
63 const double x = -1.0L / 0.0L;
64 const float eps = 1.0e-40;
65
66 if (fabs(atan(x) + M_PI_2) > eps)
67 atf_tc_fail_nonfatal("atan(-Inf) != -pi/2");
68 #endif
69 }
70
71 ATF_TC(atan_inf_pos);
72 ATF_TC_HEAD(atan_inf_pos, tc)
73 {
74 atf_tc_set_md_var(tc, "descr", "Test atan(+Inf) == pi/2");
75 }
76
77 ATF_TC_BODY(atan_inf_pos, tc)
78 {
79 #ifndef __vax__
80 const double x = +1.0L / 0.0L;
81 const float eps = 1.0e-40;
82
83 if (fabs(atan(x) - M_PI_2) > eps)
84 atf_tc_fail_nonfatal("atan(+Inf) != pi/2");
85 #endif
86 }
87
88 ATF_TC(atan_tan);
89 ATF_TC_HEAD(atan_tan, tc)
90 {
91 atf_tc_set_md_var(tc, "descr", "Test atan(tan(x)) == x");
92 }
93
94 ATF_TC_BODY(atan_tan, tc)
95 {
96 #ifndef __vax__
97 const double x[] = { 0.0, 1.0, M_PI / 2, M_PI / 3, M_PI / 6 };
98 const double eps = 1.0e-40;
99 double y;
100 size_t i;
101
102 for (i = 0; i < __arraycount(x); i++) {
103
104 y = atan(tan(x[i]));
105
106 if (fabs(y - x[i]) > eps)
107 atf_tc_fail_nonfatal("atan(tan(%0.03f)) != %0.03f",
108 x[i], x[i]);
109 }
110 #endif
111 }
112
113 ATF_TC(atan_zero_neg);
114 ATF_TC_HEAD(atan_zero_neg, tc)
115 {
116 atf_tc_set_md_var(tc, "descr", "Test atan(-0.0) == -0.0");
117 }
118
119 ATF_TC_BODY(atan_zero_neg, tc)
120 {
121 #ifndef __vax__
122 const double x = -0.0L;
123 double y = atan(x);
124
125 if (fabs(y) > 0.0 || signbit(y) == 0)
126 atf_tc_fail_nonfatal("atan(-0.0) != -0.0");
127 #endif
128 }
129
130 ATF_TC(atan_zero_pos);
131 ATF_TC_HEAD(atan_zero_pos, tc)
132 {
133 atf_tc_set_md_var(tc, "descr", "Test atan(+0.0) == +0.0");
134 }
135
136 ATF_TC_BODY(atan_zero_pos, tc)
137 {
138 #ifndef __vax__
139 const double x = 0.0L;
140 double y = atan(x);
141
142 if (fabs(y) > 0.0 || signbit(y) != 0)
143 atf_tc_fail_nonfatal("atan(+0.0) != +0.0");
144 #endif
145 }
146
147 /*
148 * atanf(3)
149 */
150 ATF_TC(atanf_nan);
151 ATF_TC_HEAD(atanf_nan, tc)
152 {
153 atf_tc_set_md_var(tc, "descr", "Test atanf(NaN) == NaN");
154 }
155
156 ATF_TC_BODY(atanf_nan, tc)
157 {
158 #ifndef __vax__
159 const float x = 0.0L / 0.0L;
160
161 if (isnan(atanf(x)) == 0)
162 atf_tc_fail_nonfatal("atanf(NaN) != NaN");
163 #endif
164 }
165
166 ATF_TC(atanf_inf_neg);
167 ATF_TC_HEAD(atanf_inf_neg, tc)
168 {
169 atf_tc_set_md_var(tc, "descr", "Test atanf(-Inf) == -pi/2");
170 }
171
172 ATF_TC_BODY(atanf_inf_neg, tc)
173 {
174 #ifndef __vax__
175 const float x = -1.0L / 0.0L;
176 const float eps = 1.0e-7;
177
178 if (fabsf(atanf(x) + M_PI_2) > eps)
179 atf_tc_fail_nonfatal("atanf(-Inf) != -pi/2");
180 #endif
181 }
182
183 ATF_TC(atanf_inf_pos);
184 ATF_TC_HEAD(atanf_inf_pos, tc)
185 {
186 atf_tc_set_md_var(tc, "descr", "Test atanf(+Inf) == pi/2");
187 }
188
189 ATF_TC_BODY(atanf_inf_pos, tc)
190 {
191 #ifndef __vax__
192 const float x = +1.0L / 0.0L;
193 const float eps = 1.0e-7;
194
195 if (fabsf(atanf(x) - M_PI_2) > eps)
196 atf_tc_fail_nonfatal("atanf(+Inf) != pi/2");
197 #endif
198 }
199
200 ATF_TC(atanf_tanf);
201 ATF_TC_HEAD(atanf_tanf, tc)
202 {
203 atf_tc_set_md_var(tc, "descr", "Test atanf(tanf(x)) == x");
204 }
205
206 ATF_TC_BODY(atanf_tanf, tc)
207 {
208 #ifndef __vax__
209 const float x[] = { 0.0, 1.0, M_PI / 3, M_PI / 6 };
210 const float eps = 1.0e-7;
211 float y;
212 size_t i;
213
214 for (i = 0; i < __arraycount(x); i++) {
215
216 y = atanf(tanf(x[i]));
217
218 if (fabsf(y - x[i]) > eps)
219 atf_tc_fail_nonfatal("atanf(tanf(%0.03f)) != %0.03f",
220 x[i], x[i]);
221 }
222 #endif
223 }
224
225 ATF_TC(atanf_zero_neg);
226 ATF_TC_HEAD(atanf_zero_neg, tc)
227 {
228 atf_tc_set_md_var(tc, "descr", "Test atanf(-0.0) == -0.0");
229 }
230
231 ATF_TC_BODY(atanf_zero_neg, tc)
232 {
233 #ifndef __vax__
234 const float x = -0.0L;
235 float y = atanf(x);
236
237 if (fabsf(y) > 0.0 || signbit(y) == 0)
238 atf_tc_fail_nonfatal("atanf(-0.0) != -0.0");
239 #endif
240 }
241
242 ATF_TC(atanf_zero_pos);
243 ATF_TC_HEAD(atanf_zero_pos, tc)
244 {
245 atf_tc_set_md_var(tc, "descr", "Test atanf(+0.0) == +0.0");
246 }
247
248 ATF_TC_BODY(atanf_zero_pos, tc)
249 {
250 #ifndef __vax__
251 const float x = 0.0L;
252 float y = atanf(x);
253
254 if (fabsf(y) > 0.0 || signbit(y) != 0)
255 atf_tc_fail_nonfatal("atanf(+0.0) != +0.0");
256 #endif
257 }
258
259 ATF_TP_ADD_TCS(tp)
260 {
261
262 ATF_TP_ADD_TC(tp, atan_nan);
263 ATF_TP_ADD_TC(tp, atan_inf_neg);
264 ATF_TP_ADD_TC(tp, atan_inf_pos);
265 ATF_TP_ADD_TC(tp, atan_tan);
266 ATF_TP_ADD_TC(tp, atan_zero_neg);
267 ATF_TP_ADD_TC(tp, atan_zero_pos);
268
269 ATF_TP_ADD_TC(tp, atanf_nan);
270 ATF_TP_ADD_TC(tp, atanf_inf_neg);
271 ATF_TP_ADD_TC(tp, atanf_inf_pos);
272 ATF_TP_ADD_TC(tp, atanf_tanf);
273 ATF_TP_ADD_TC(tp, atanf_zero_neg);
274 ATF_TP_ADD_TC(tp, atanf_zero_pos);
275
276 return atf_no_error();
277 }
278