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
240274601Sngie#if !defined(__FreeBSD__) || LDBL_PREC != 53
241272343Sngie/*
242272343Sngie * cbrtl(3)
243272343Sngie */
244272343SngieATF_TC(cbrtl_nan);
245272343SngieATF_TC_HEAD(cbrtl_nan, tc)
246272343Sngie{
247272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(NaN) == NaN");
248272343Sngie}
249272343Sngie
250272343SngieATF_TC_BODY(cbrtl_nan, tc)
251272343Sngie{
252272343Sngie	const long double x = 0.0L / 0.0L;
253272343Sngie
254272343Sngie	ATF_CHECK(isnan(x) != 0);
255272343Sngie	ATF_CHECK(isnan(cbrtl(x)) != 0);
256272343Sngie}
257272343Sngie
258272343SngieATF_TC(cbrtl_powl);
259272343SngieATF_TC_HEAD(cbrtl_powl, tc)
260272343Sngie{
261272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(3) vs. powl(3)");
262272343Sngie}
263272343Sngie
264272343SngieATF_TC_BODY(cbrtl_powl, tc)
265272343Sngie{
266272343Sngie	const long double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.0 };
267272343Sngie	const long double eps = 1.0e-15;
268272343Sngie	long double y, z;
269272343Sngie	size_t i;
270272343Sngie
271272343Sngie	for (i = 0; i < __arraycount(x); i++) {
272272343Sngie
273272343Sngie		y = cbrtl(x[i]);
274274601Sngie#ifdef __FreeBSD__
275274601Sngie		z = powl(x[i], (long double)1.0 / 3.0);
276274601Sngie#else
277272343Sngie		z = powl(x[i], 1.0 / 3.0);
278274601Sngie#endif
279272343Sngie
280272343Sngie		if (fabsl(y - z) > eps * fabsl(1 + x[i]))
281272343Sngie			atf_tc_fail_nonfatal("cbrtl(%0.03Lf) != "
282272343Sngie			    "powl(%0.03Lf, 1/3)\n", x[i], x[i]);
283272343Sngie	}
284272343Sngie}
285272343Sngie
286272343SngieATF_TC(cbrtl_inf_neg);
287272343SngieATF_TC_HEAD(cbrtl_inf_neg, tc)
288272343Sngie{
289272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(-Inf) == -Inf");
290272343Sngie}
291272343Sngie
292272343SngieATF_TC_BODY(cbrtl_inf_neg, tc)
293272343Sngie{
294272343Sngie	const long double x = -1.0L / 0.0L;
295272343Sngie	long double y = cbrtl(x);
296272343Sngie
297272343Sngie	ATF_CHECK(isinf(y) != 0);
298272343Sngie	ATF_CHECK(signbit(y) != 0);
299272343Sngie}
300272343Sngie
301272343SngieATF_TC(cbrtl_inf_pos);
302272343SngieATF_TC_HEAD(cbrtl_inf_pos, tc)
303272343Sngie{
304272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(+Inf) == +Inf");
305272343Sngie}
306272343Sngie
307272343SngieATF_TC_BODY(cbrtl_inf_pos, tc)
308272343Sngie{
309272343Sngie	const long double x = 1.0L / 0.0L;
310272343Sngie	long double y = cbrtl(x);
311272343Sngie
312272343Sngie	ATF_CHECK(isinf(y) != 0);
313272343Sngie	ATF_CHECK(signbit(y) == 0);
314272343Sngie}
315272343Sngie
316272343SngieATF_TC(cbrtl_zero_neg);
317272343SngieATF_TC_HEAD(cbrtl_zero_neg, tc)
318272343Sngie{
319272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(-0.0) == -0.0");
320272343Sngie}
321272343Sngie
322272343SngieATF_TC_BODY(cbrtl_zero_neg, tc)
323272343Sngie{
324272343Sngie	const long double x = -0.0L;
325272343Sngie	long double y = cbrtl(x);
326272343Sngie
327272343Sngie	if (fabsl(y) > 0.0 || signbit(y) == 0)
328272343Sngie		atf_tc_fail_nonfatal("cbrtl(-0.0) != -0.0");
329272343Sngie}
330272343Sngie
331272343SngieATF_TC(cbrtl_zero_pos);
332272343SngieATF_TC_HEAD(cbrtl_zero_pos, tc)
333272343Sngie{
334272343Sngie	atf_tc_set_md_var(tc, "descr", "Test cbrtl(+0.0) == +0.0");
335272343Sngie}
336272343Sngie
337272343SngieATF_TC_BODY(cbrtl_zero_pos, tc)
338272343Sngie{
339272343Sngie	const long double x = 0.0L;
340272343Sngie	long double y = cbrtl(x);
341272343Sngie
342272343Sngie	if (fabsl(y) > 0.0 || signbit(y) != 0)
343272343Sngie		atf_tc_fail_nonfatal("cbrtl(+0.0) != +0.0");
344272343Sngie}
345274601Sngie#endif
346272343Sngie
347272343SngieATF_TP_ADD_TCS(tp)
348272343Sngie{
349272343Sngie
350272343Sngie	ATF_TP_ADD_TC(tp, cbrt_nan);
351272343Sngie	ATF_TP_ADD_TC(tp, cbrt_pow);
352272343Sngie	ATF_TP_ADD_TC(tp, cbrt_inf_neg);
353272343Sngie	ATF_TP_ADD_TC(tp, cbrt_inf_pos);
354272343Sngie	ATF_TP_ADD_TC(tp, cbrt_zero_neg);
355272343Sngie	ATF_TP_ADD_TC(tp, cbrt_zero_pos);
356272343Sngie
357272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_nan);
358272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_powf);
359272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_inf_neg);
360272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_inf_pos);
361272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_zero_neg);
362272343Sngie	ATF_TP_ADD_TC(tp, cbrtf_zero_pos);
363272343Sngie
364274601Sngie#if !defined(__FreeBSD__) || LDBL_PREC != 53
365272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_nan);
366272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_powl);
367272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_inf_neg);
368272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_inf_pos);
369272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_zero_neg);
370272343Sngie	ATF_TP_ADD_TC(tp, cbrtl_zero_pos);
371274601Sngie#endif
372272343Sngie
373272343Sngie	return atf_no_error();
374272343Sngie}
375