t_cbrt.c revision 272343
1272343Sngie/* $NetBSD: t_cbrt.c,v 1.3 2014/03/03 10:39:08 martin Exp $ */
2272343Sngie
3272343Sngie/*-
4272343Sngie * Copyright (c) 2011 The NetBSD Foundation, Inc.
5272343Sngie * All rights reserved.
6272343Sngie *
7272343Sngie * This code is derived from software contributed to The NetBSD Foundation
8272343Sngie * by Jukka Ruohonen.
9272343Sngie *
10272343Sngie * Redistribution and use in source and binary forms, with or without
11272343Sngie * modification, are permitted provided that the following conditions
12272343Sngie * are met:
13272343Sngie * 1. Redistributions of source code must retain the above copyright
14272343Sngie *    notice, this list of conditions and the following disclaimer.
15272343Sngie * 2. Redistributions in binary form must reproduce the above copyright
16272343Sngie *    notice, this list of conditions and the following disclaimer in the
17272343Sngie *    documentation and/or other materials provided with the distribution.
18272343Sngie *
19272343Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21272343Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22272343Sngie * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23272343Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24272343Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25272343Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26272343Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27272343Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28272343Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29272343Sngie * POSSIBILITY OF SUCH DAMAGE.
30272343Sngie */
31272343Sngie#include <sys/cdefs.h>
32272343Sngie__RCSID("$NetBSD: t_cbrt.c,v 1.3 2014/03/03 10:39:08 martin Exp $");
33272343Sngie
34272343Sngie#include <atf-c.h>
35272343Sngie#include <math.h>
36272343Sngie#include <stdio.h>
37272343Sngie
38272343Sngie/*
39272343Sngie * cbrt(3)
40272343Sngie */
41272343SngieATF_TC(cbrt_nan);
42272343SngieATF_TC_HEAD(cbrt_nan, tc)
43272343Sngie{
44272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrt(NaN) == NaN");
45272343Sngie}
46272343Sngie
47272343SngieATF_TC_BODY(cbrt_nan, tc)
48272343Sngie{
49272343Sngie	const double x = 0.0L / 0.0L;
50272343Sngie
51272343Sngie	ATF_CHECK(isnan(x) != 0);
52272343Sngie	ATF_CHECK(isnan(cbrt(x)) != 0);
53272343Sngie}
54272343Sngie
55272343SngieATF_TC(cbrt_pow);
56272343SngieATF_TC_HEAD(cbrt_pow, tc)
57272343Sngie{
58272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrt(3) vs. pow(3)");
59272343Sngie}
60272343Sngie
61272343SngieATF_TC_BODY(cbrt_pow, tc)
62272343Sngie{
63272343Sngie	const double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.0 };
64272343Sngie	const double eps = 1.0e-14;
65272343Sngie	double y, z;
66272343Sngie	size_t i;
67272343Sngie
68272343Sngie	for (i = 0; i < __arraycount(x); i++) {
69272343Sngie
70272343Sngie		y = cbrt(x[i]);
71272343Sngie		z = pow(x[i], 1.0 / 3.0);
72272343Sngie
73272343Sngie		if (fabs(y - z) > eps)
74272343Sngie			atf_tc_fail_nonfatal("cbrt(%0.03f) != "
75272343Sngie			    "pow(%0.03f, 1/3)\n", x[i], x[i]);
76272343Sngie	}
77272343Sngie}
78272343Sngie
79272343SngieATF_TC(cbrt_inf_neg);
80272343SngieATF_TC_HEAD(cbrt_inf_neg, tc)
81272343Sngie{
82272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrt(-Inf) == -Inf");
83272343Sngie}
84272343Sngie
85272343SngieATF_TC_BODY(cbrt_inf_neg, tc)
86272343Sngie{
87272343Sngie	const double x = -1.0L / 0.0L;
88272343Sngie	double y = cbrt(x);
89272343Sngie
90272343Sngie	ATF_CHECK(isinf(y) != 0);
91272343Sngie	ATF_CHECK(signbit(y) != 0);
92272343Sngie}
93272343Sngie
94272343SngieATF_TC(cbrt_inf_pos);
95272343SngieATF_TC_HEAD(cbrt_inf_pos, tc)
96272343Sngie{
97272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrt(+Inf) == +Inf");
98272343Sngie}
99272343Sngie
100272343SngieATF_TC_BODY(cbrt_inf_pos, tc)
101272343Sngie{
102272343Sngie	const double x = 1.0L / 0.0L;
103272343Sngie	double y = cbrt(x);
104272343Sngie
105272343Sngie	ATF_CHECK(isinf(y) != 0);
106272343Sngie	ATF_CHECK(signbit(y) == 0);
107272343Sngie}
108272343Sngie
109272343SngieATF_TC(cbrt_zero_neg);
110272343SngieATF_TC_HEAD(cbrt_zero_neg, tc)
111272343Sngie{
112272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrt(-0.0) == -0.0");
113272343Sngie}
114272343Sngie
115272343SngieATF_TC_BODY(cbrt_zero_neg, tc)
116272343Sngie{
117272343Sngie	const double x = -0.0L;
118272343Sngie	double y = cbrt(x);
119272343Sngie
120272343Sngie	if (fabs(y) > 0.0 || signbit(y) == 0)
121272343Sngie		atf_tc_fail_nonfatal("cbrt(-0.0) != -0.0");
122272343Sngie}
123272343Sngie
124272343SngieATF_TC(cbrt_zero_pos);
125272343SngieATF_TC_HEAD(cbrt_zero_pos, tc)
126272343Sngie{
127272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrt(+0.0) == +0.0");
128272343Sngie}
129272343Sngie
130272343SngieATF_TC_BODY(cbrt_zero_pos, tc)
131272343Sngie{
132272343Sngie	const double x = 0.0L;
133272343Sngie	double y = cbrt(x);
134272343Sngie
135272343Sngie	if (fabs(y) > 0.0 || signbit(y) != 0)
136272343Sngie		atf_tc_fail_nonfatal("cbrt(+0.0) != +0.0");
137272343Sngie}
138272343Sngie
139272343Sngie/*
140272343Sngie * cbrtf(3)
141272343Sngie */
142272343SngieATF_TC(cbrtf_nan);
143272343SngieATF_TC_HEAD(cbrtf_nan, tc)
144272343Sngie{
145272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtf(NaN) == NaN");
146272343Sngie}
147272343Sngie
148272343SngieATF_TC_BODY(cbrtf_nan, tc)
149272343Sngie{
150272343Sngie	const float x = 0.0L / 0.0L;
151272343Sngie
152272343Sngie	ATF_CHECK(isnan(x) != 0);
153272343Sngie	ATF_CHECK(isnan(cbrtf(x)) != 0);
154272343Sngie}
155272343Sngie
156272343SngieATF_TC(cbrtf_powf);
157272343SngieATF_TC_HEAD(cbrtf_powf, tc)
158272343Sngie{
159272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtf(3) vs. powf(3)");
160272343Sngie}
161272343Sngie
162272343SngieATF_TC_BODY(cbrtf_powf, tc)
163272343Sngie{
164272343Sngie	const float x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.0 };
165272343Sngie	const float eps = 1.0e-5;
166272343Sngie	float y, z;
167272343Sngie	size_t i;
168272343Sngie
169272343Sngie	for (i = 0; i < __arraycount(x); i++) {
170272343Sngie
171272343Sngie		y = cbrtf(x[i]);
172272343Sngie		z = powf(x[i], 1.0 / 3.0);
173272343Sngie
174272343Sngie		if (fabsf(y - z) > eps)
175272343Sngie			atf_tc_fail_nonfatal("cbrtf(%0.03f) != "
176272343Sngie			    "powf(%0.03f, 1/3)\n", x[i], x[i]);
177272343Sngie	}
178272343Sngie}
179272343Sngie
180272343SngieATF_TC(cbrtf_inf_neg);
181272343SngieATF_TC_HEAD(cbrtf_inf_neg, tc)
182272343Sngie{
183272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtf(-Inf) == -Inf");
184272343Sngie}
185272343Sngie
186272343SngieATF_TC_BODY(cbrtf_inf_neg, tc)
187272343Sngie{
188272343Sngie	const float x = -1.0L / 0.0L;
189272343Sngie	float y = cbrtf(x);
190272343Sngie
191272343Sngie	ATF_CHECK(isinf(y) != 0);
192272343Sngie	ATF_CHECK(signbit(y) != 0);
193272343Sngie}
194272343Sngie
195272343SngieATF_TC(cbrtf_inf_pos);
196272343SngieATF_TC_HEAD(cbrtf_inf_pos, tc)
197272343Sngie{
198272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtf(+Inf) == +Inf");
199272343Sngie}
200272343Sngie
201272343SngieATF_TC_BODY(cbrtf_inf_pos, tc)
202272343Sngie{
203272343Sngie	const float x = 1.0L / 0.0L;
204272343Sngie	float y = cbrtf(x);
205272343Sngie
206272343Sngie	ATF_CHECK(isinf(y) != 0);
207272343Sngie	ATF_CHECK(signbit(y) == 0);
208272343Sngie}
209272343Sngie
210272343SngieATF_TC(cbrtf_zero_neg);
211272343SngieATF_TC_HEAD(cbrtf_zero_neg, tc)
212272343Sngie{
213272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtf(-0.0) == -0.0");
214272343Sngie}
215272343Sngie
216272343SngieATF_TC_BODY(cbrtf_zero_neg, tc)
217272343Sngie{
218272343Sngie	const float x = -0.0L;
219272343Sngie	float y = cbrtf(x);
220272343Sngie
221272343Sngie	if (fabsf(y) > 0.0 || signbit(y) == 0)
222272343Sngie		atf_tc_fail_nonfatal("cbrtf(-0.0) != -0.0");
223272343Sngie}
224272343Sngie
225272343SngieATF_TC(cbrtf_zero_pos);
226272343SngieATF_TC_HEAD(cbrtf_zero_pos, tc)
227272343Sngie{
228272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtf(+0.0) == +0.0");
229272343Sngie}
230272343Sngie
231272343SngieATF_TC_BODY(cbrtf_zero_pos, tc)
232272343Sngie{
233272343Sngie	const float x = 0.0L;
234272343Sngie	float y = cbrtf(x);
235272343Sngie
236272343Sngie	if (fabsf(y) > 0.0 || signbit(y) != 0)
237272343Sngie		atf_tc_fail_nonfatal("cbrtf(+0.0) != +0.0");
238272343Sngie}
239272343Sngie
240272343Sngie/*
241272343Sngie * cbrtl(3)
242272343Sngie */
243272343SngieATF_TC(cbrtl_nan);
244272343SngieATF_TC_HEAD(cbrtl_nan, tc)
245272343Sngie{
246272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(NaN) == NaN");
247272343Sngie}
248272343Sngie
249272343SngieATF_TC_BODY(cbrtl_nan, tc)
250272343Sngie{
251272343Sngie	const long double x = 0.0L / 0.0L;
252272343Sngie
253272343Sngie	ATF_CHECK(isnan(x) != 0);
254272343Sngie	ATF_CHECK(isnan(cbrtl(x)) != 0);
255272343Sngie}
256272343Sngie
257272343SngieATF_TC(cbrtl_powl);
258272343SngieATF_TC_HEAD(cbrtl_powl, tc)
259272343Sngie{
260272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(3) vs. powl(3)");
261272343Sngie}
262272343Sngie
263272343SngieATF_TC_BODY(cbrtl_powl, tc)
264272343Sngie{
265272343Sngie	const long double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.0 };
266272343Sngie	const long double eps = 1.0e-15;
267272343Sngie	long double y, z;
268272343Sngie	size_t i;
269272343Sngie
270272343Sngie	for (i = 0; i < __arraycount(x); i++) {
271272343Sngie
272272343Sngie		y = cbrtl(x[i]);
273272343Sngie		z = powl(x[i], 1.0 / 3.0);
274272343Sngie
275272343Sngie		if (fabsl(y - z) > eps * fabsl(1 + x[i]))
276272343Sngie			atf_tc_fail_nonfatal("cbrtl(%0.03Lf) != "
277272343Sngie			    "powl(%0.03Lf, 1/3)\n", x[i], x[i]);
278272343Sngie	}
279272343Sngie}
280272343Sngie
281272343SngieATF_TC(cbrtl_inf_neg);
282272343SngieATF_TC_HEAD(cbrtl_inf_neg, tc)
283272343Sngie{
284272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(-Inf) == -Inf");
285272343Sngie}
286272343Sngie
287272343SngieATF_TC_BODY(cbrtl_inf_neg, tc)
288272343Sngie{
289272343Sngie	const long double x = -1.0L / 0.0L;
290272343Sngie	long double y = cbrtl(x);
291272343Sngie
292272343Sngie	ATF_CHECK(isinf(y) != 0);
293272343Sngie	ATF_CHECK(signbit(y) != 0);
294272343Sngie}
295272343Sngie
296272343SngieATF_TC(cbrtl_inf_pos);
297272343SngieATF_TC_HEAD(cbrtl_inf_pos, tc)
298272343Sngie{
299272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(+Inf) == +Inf");
300272343Sngie}
301272343Sngie
302272343SngieATF_TC_BODY(cbrtl_inf_pos, tc)
303272343Sngie{
304272343Sngie	const long double x = 1.0L / 0.0L;
305272343Sngie	long double y = cbrtl(x);
306272343Sngie
307272343Sngie	ATF_CHECK(isinf(y) != 0);
308272343Sngie	ATF_CHECK(signbit(y) == 0);
309272343Sngie}
310272343Sngie
311272343SngieATF_TC(cbrtl_zero_neg);
312272343SngieATF_TC_HEAD(cbrtl_zero_neg, tc)
313272343Sngie{
314272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(-0.0) == -0.0");
315272343Sngie}
316272343Sngie
317272343SngieATF_TC_BODY(cbrtl_zero_neg, tc)
318272343Sngie{
319272343Sngie	const long double x = -0.0L;
320272343Sngie	long double y = cbrtl(x);
321272343Sngie
322272343Sngie	if (fabsl(y) > 0.0 || signbit(y) == 0)
323272343Sngie		atf_tc_fail_nonfatal("cbrtl(-0.0) != -0.0");
324272343Sngie}
325272343Sngie
326272343SngieATF_TC(cbrtl_zero_pos);
327272343SngieATF_TC_HEAD(cbrtl_zero_pos, tc)
328272343Sngie{
329272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(+0.0) == +0.0");
330272343Sngie}
331272343Sngie
332272343SngieATF_TC_BODY(cbrtl_zero_pos, tc)
333272343Sngie{
334272343Sngie	const long double x = 0.0L;
335272343Sngie	long double y = cbrtl(x);
336272343Sngie
337272343Sngie	if (fabsl(y) > 0.0 || signbit(y) != 0)
338272343Sngie		atf_tc_fail_nonfatal("cbrtl(+0.0) != +0.0");
339272343Sngie}
340272343Sngie
341272343SngieATF_TP_ADD_TCS(tp)
342272343Sngie{
343272343Sngie
344272343Sngie	ATF_TP_ADD_TC(tp, cbrt_nan);
345272343Sngie	ATF_TP_ADD_TC(tp, cbrt_pow);
346272343Sngie	ATF_TP_ADD_TC(tp, cbrt_inf_neg);
347272343Sngie	ATF_TP_ADD_TC(tp, cbrt_inf_pos);
348272343Sngie	ATF_TP_ADD_TC(tp, cbrt_zero_neg);
349272343Sngie	ATF_TP_ADD_TC(tp, cbrt_zero_pos);
350272343Sngie
351272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_nan);
352272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_powf);
353272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_inf_neg);
354272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_inf_pos);
355272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_zero_neg);
356272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_zero_pos);
357272343Sngie
358272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_nan);
359272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_powl);
360272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_inf_neg);
361272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_inf_pos);
362272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_zero_neg);
363272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_zero_pos);
364272343Sngie
365272343Sngie	return atf_no_error();
366272343Sngie}
367