xref: /freebsd/contrib/netbsd-tests/lib/libm/t_cos.c (revision 1ec3feb64826d2a43d41e74684690985bf20e71c)
1*1ec3feb6SAlex Richardson /* $NetBSD: t_cos.c,v 1.9 2019/05/27 00:10:36 maya Exp $ */
257718be8SEnji Cooper 
357718be8SEnji Cooper /*-
457718be8SEnji Cooper  * Copyright (c) 2011 The NetBSD Foundation, Inc.
557718be8SEnji Cooper  * All rights reserved.
657718be8SEnji Cooper  *
757718be8SEnji Cooper  * This code is derived from software contributed to The NetBSD Foundation
857718be8SEnji Cooper  * by Jukka Ruohonen.
957718be8SEnji Cooper  *
1057718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
1157718be8SEnji Cooper  * modification, are permitted provided that the following conditions
1257718be8SEnji Cooper  * are met:
1357718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
1457718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
1557718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
1657718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
1757718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
1857718be8SEnji Cooper  *
1957718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2057718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2157718be8SEnji Cooper  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2257718be8SEnji Cooper  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2357718be8SEnji Cooper  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2457718be8SEnji Cooper  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2557718be8SEnji Cooper  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2657718be8SEnji Cooper  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2757718be8SEnji Cooper  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2857718be8SEnji Cooper  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2957718be8SEnji Cooper  * POSSIBILITY OF SUCH DAMAGE.
3057718be8SEnji Cooper  */
3157718be8SEnji Cooper 
32*1ec3feb6SAlex Richardson #include <assert.h>
3357718be8SEnji Cooper #include <atf-c.h>
34*1ec3feb6SAlex Richardson #include <float.h>
3557718be8SEnji Cooper #include <math.h>
3657718be8SEnji Cooper 
3757718be8SEnji Cooper static const struct {
3857718be8SEnji Cooper 	int		angle;
3957718be8SEnji Cooper 	double		x;
4057718be8SEnji Cooper 	double		y;
41*1ec3feb6SAlex Richardson 	float		fy;
4257718be8SEnji Cooper } angles[] = {
43*1ec3feb6SAlex Richardson 	{ -180, -3.141592653589793, -1.0000000000000000, 999 },
44*1ec3feb6SAlex Richardson 	{ -135, -2.356194490192345, -0.7071067811865476, 999 },
45*1ec3feb6SAlex Richardson 	{  -90, -1.5707963267948966, 6.123233995736766e-17, -4.3711388e-08 },
46*1ec3feb6SAlex Richardson 	{  -90, -1.5707963267948968, -1.6081226496766366e-16, -4.3711388e-08 },
47*1ec3feb6SAlex Richardson 	{  -45, -0.785398163397448,  0.7071067811865478, 999 },
48*1ec3feb6SAlex Richardson 	{    0,  0.000000000000000,  1.0000000000000000, 999 },
49*1ec3feb6SAlex Richardson 	{   30,  0.523598775598299,  0.8660254037844386, 999 },
50*1ec3feb6SAlex Richardson 	{   45,  0.785398163397448,  0.7071067811865478, 999 },
51*1ec3feb6SAlex Richardson 	{   60,  1.0471975511965976,  0.5000000000000001, 999 },
52*1ec3feb6SAlex Richardson 	{   60,  1.0471975511965979,  0.4999999999999999, 999 },
53*1ec3feb6SAlex Richardson 	{   90,  1.570796326794897, -3.8285686989269494e-16, -4.3711388e-08 },
54*1ec3feb6SAlex Richardson 	{  120,  2.0943951023931953, -0.4999999999999998, 999 },
55*1ec3feb6SAlex Richardson 	{  120,  2.0943951023931957, -0.5000000000000002, 999 },
56*1ec3feb6SAlex Richardson 	{  135,  2.356194490192345, -0.7071067811865476, 999 },
57*1ec3feb6SAlex Richardson 	{  150,  2.617993877991494, -0.8660254037844386, 999 },
58*1ec3feb6SAlex Richardson 	{  180,  3.141592653589793, -1.0000000000000000, 999 },
59*1ec3feb6SAlex Richardson 	{  270,  4.712388980384690, -1.8369701987210297e-16, 1.1924881e-08 },
60*1ec3feb6SAlex Richardson 	{  360,  6.283185307179586,  1.0000000000000000, 999 },
6157718be8SEnji Cooper };
6257718be8SEnji Cooper 
63*1ec3feb6SAlex Richardson #ifdef __HAVE_LONG_DOUBLE
64*1ec3feb6SAlex Richardson /*
65*1ec3feb6SAlex Richardson  * cosl(3)
66*1ec3feb6SAlex Richardson  */
67*1ec3feb6SAlex Richardson ATF_TC(cosl_angles);
ATF_TC_HEAD(cosl_angles,tc)68*1ec3feb6SAlex Richardson ATF_TC_HEAD(cosl_angles, tc)
69*1ec3feb6SAlex Richardson {
70*1ec3feb6SAlex Richardson 	atf_tc_set_md_var(tc, "descr", "Test some selected angles");
71*1ec3feb6SAlex Richardson }
72*1ec3feb6SAlex Richardson 
ATF_TC_BODY(cosl_angles,tc)73*1ec3feb6SAlex Richardson ATF_TC_BODY(cosl_angles, tc)
74*1ec3feb6SAlex Richardson {
75*1ec3feb6SAlex Richardson 	/*
76*1ec3feb6SAlex Richardson 	 * XXX The given data is for double, so take that
77*1ec3feb6SAlex Richardson 	 * into account and expect less precise results..
78*1ec3feb6SAlex Richardson 	 */
79*1ec3feb6SAlex Richardson 	const long double eps = DBL_EPSILON;
80*1ec3feb6SAlex Richardson 	size_t i;
81*1ec3feb6SAlex Richardson 
82*1ec3feb6SAlex Richardson 	for (i = 0; i < __arraycount(angles); i++) {
83*1ec3feb6SAlex Richardson 		int deg = angles[i].angle;
84*1ec3feb6SAlex Richardson 		long double theta = angles[i].x;
85*1ec3feb6SAlex Richardson 		long double cos_theta = angles[i].y;
86*1ec3feb6SAlex Richardson 
87*1ec3feb6SAlex Richardson 		assert(cos_theta != 0);
88*1ec3feb6SAlex Richardson 		if (!(fabsl((cosl(theta) - cos_theta)/cos_theta) <= eps)) {
89*1ec3feb6SAlex Richardson 			atf_tc_fail_nonfatal("cos(%d deg = %.17Lg) = %.17Lg"
90*1ec3feb6SAlex Richardson 			    " != %.17Lg",
91*1ec3feb6SAlex Richardson 			    deg, theta, cosl(theta), cos_theta);
92*1ec3feb6SAlex Richardson 		}
93*1ec3feb6SAlex Richardson 	}
94*1ec3feb6SAlex Richardson }
95*1ec3feb6SAlex Richardson 
96*1ec3feb6SAlex Richardson ATF_TC(cosl_nan);
ATF_TC_HEAD(cosl_nan,tc)97*1ec3feb6SAlex Richardson ATF_TC_HEAD(cosl_nan, tc)
98*1ec3feb6SAlex Richardson {
99*1ec3feb6SAlex Richardson 	atf_tc_set_md_var(tc, "descr", "Test cosl(NaN) == NaN");
100*1ec3feb6SAlex Richardson }
101*1ec3feb6SAlex Richardson 
ATF_TC_BODY(cosl_nan,tc)102*1ec3feb6SAlex Richardson ATF_TC_BODY(cosl_nan, tc)
103*1ec3feb6SAlex Richardson {
104*1ec3feb6SAlex Richardson 	const long double x = 0.0L / 0.0L;
105*1ec3feb6SAlex Richardson 
106*1ec3feb6SAlex Richardson 	ATF_CHECK(isnan(x) != 0);
107*1ec3feb6SAlex Richardson 	ATF_CHECK(isnan(cosl(x)) != 0);
108*1ec3feb6SAlex Richardson }
109*1ec3feb6SAlex Richardson 
110*1ec3feb6SAlex Richardson ATF_TC(cosl_inf_neg);
ATF_TC_HEAD(cosl_inf_neg,tc)111*1ec3feb6SAlex Richardson ATF_TC_HEAD(cosl_inf_neg, tc)
112*1ec3feb6SAlex Richardson {
113*1ec3feb6SAlex Richardson 	atf_tc_set_md_var(tc, "descr", "Test cosl(-Inf) == NaN");
114*1ec3feb6SAlex Richardson }
115*1ec3feb6SAlex Richardson 
ATF_TC_BODY(cosl_inf_neg,tc)116*1ec3feb6SAlex Richardson ATF_TC_BODY(cosl_inf_neg, tc)
117*1ec3feb6SAlex Richardson {
118*1ec3feb6SAlex Richardson 	const long double x = -1.0L / 0.0L;
119*1ec3feb6SAlex Richardson 
120*1ec3feb6SAlex Richardson 	ATF_CHECK(isnan(cosl(x)) != 0);
121*1ec3feb6SAlex Richardson }
122*1ec3feb6SAlex Richardson 
123*1ec3feb6SAlex Richardson ATF_TC(cosl_inf_pos);
ATF_TC_HEAD(cosl_inf_pos,tc)124*1ec3feb6SAlex Richardson ATF_TC_HEAD(cosl_inf_pos, tc)
125*1ec3feb6SAlex Richardson {
126*1ec3feb6SAlex Richardson 	atf_tc_set_md_var(tc, "descr", "Test cosl(+Inf) == NaN");
127*1ec3feb6SAlex Richardson }
128*1ec3feb6SAlex Richardson 
ATF_TC_BODY(cosl_inf_pos,tc)129*1ec3feb6SAlex Richardson ATF_TC_BODY(cosl_inf_pos, tc)
130*1ec3feb6SAlex Richardson {
131*1ec3feb6SAlex Richardson 	const long double x = 1.0L / 0.0L;
132*1ec3feb6SAlex Richardson 
133*1ec3feb6SAlex Richardson 	ATF_CHECK(isnan(cosl(x)) != 0);
134*1ec3feb6SAlex Richardson }
135*1ec3feb6SAlex Richardson 
136*1ec3feb6SAlex Richardson 
137*1ec3feb6SAlex Richardson ATF_TC(cosl_zero_neg);
ATF_TC_HEAD(cosl_zero_neg,tc)138*1ec3feb6SAlex Richardson ATF_TC_HEAD(cosl_zero_neg, tc)
139*1ec3feb6SAlex Richardson {
140*1ec3feb6SAlex Richardson 	atf_tc_set_md_var(tc, "descr", "Test cosl(-0.0) == 1.0");
141*1ec3feb6SAlex Richardson }
142*1ec3feb6SAlex Richardson 
ATF_TC_BODY(cosl_zero_neg,tc)143*1ec3feb6SAlex Richardson ATF_TC_BODY(cosl_zero_neg, tc)
144*1ec3feb6SAlex Richardson {
145*1ec3feb6SAlex Richardson 	const long double x = -0.0L;
146*1ec3feb6SAlex Richardson 
147*1ec3feb6SAlex Richardson 	ATF_CHECK(cosl(x) == 1.0);
148*1ec3feb6SAlex Richardson }
149*1ec3feb6SAlex Richardson 
150*1ec3feb6SAlex Richardson ATF_TC(cosl_zero_pos);
ATF_TC_HEAD(cosl_zero_pos,tc)151*1ec3feb6SAlex Richardson ATF_TC_HEAD(cosl_zero_pos, tc)
152*1ec3feb6SAlex Richardson {
153*1ec3feb6SAlex Richardson 	atf_tc_set_md_var(tc, "descr", "Test cosl(+0.0) == 1.0");
154*1ec3feb6SAlex Richardson }
155*1ec3feb6SAlex Richardson 
ATF_TC_BODY(cosl_zero_pos,tc)156*1ec3feb6SAlex Richardson ATF_TC_BODY(cosl_zero_pos, tc)
157*1ec3feb6SAlex Richardson {
158*1ec3feb6SAlex Richardson 	const long double x = 0.0L;
159*1ec3feb6SAlex Richardson 
160*1ec3feb6SAlex Richardson 	ATF_CHECK(cosl(x) == 1.0);
161*1ec3feb6SAlex Richardson }
162*1ec3feb6SAlex Richardson #endif
163*1ec3feb6SAlex Richardson 
16457718be8SEnji Cooper /*
16557718be8SEnji Cooper  * cos(3)
16657718be8SEnji Cooper  */
16757718be8SEnji Cooper ATF_TC(cos_angles);
ATF_TC_HEAD(cos_angles,tc)16857718be8SEnji Cooper ATF_TC_HEAD(cos_angles, tc)
16957718be8SEnji Cooper {
17057718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test some selected angles");
17157718be8SEnji Cooper }
17257718be8SEnji Cooper 
ATF_TC_BODY(cos_angles,tc)17357718be8SEnji Cooper ATF_TC_BODY(cos_angles, tc)
17457718be8SEnji Cooper {
175*1ec3feb6SAlex Richardson 	const double eps = DBL_EPSILON;
17657718be8SEnji Cooper 	size_t i;
17757718be8SEnji Cooper 
17857718be8SEnji Cooper 	for (i = 0; i < __arraycount(angles); i++) {
179*1ec3feb6SAlex Richardson 		int deg = angles[i].angle;
180*1ec3feb6SAlex Richardson 		double theta = angles[i].x;
181*1ec3feb6SAlex Richardson 		double cos_theta = angles[i].y;
18257718be8SEnji Cooper 
183*1ec3feb6SAlex Richardson 		assert(cos_theta != 0);
184*1ec3feb6SAlex Richardson 		if (!(fabs((cos(theta) - cos_theta)/cos_theta) <= eps)) {
185*1ec3feb6SAlex Richardson 			atf_tc_fail_nonfatal("cos(%d deg = %.17g) = %.17g"
186*1ec3feb6SAlex Richardson 			    " != %.17g",
187*1ec3feb6SAlex Richardson 			    deg, theta, cos(theta), cos_theta);
188*1ec3feb6SAlex Richardson 		}
18957718be8SEnji Cooper 	}
19057718be8SEnji Cooper }
19157718be8SEnji Cooper 
19257718be8SEnji Cooper ATF_TC(cos_nan);
ATF_TC_HEAD(cos_nan,tc)19357718be8SEnji Cooper ATF_TC_HEAD(cos_nan, tc)
19457718be8SEnji Cooper {
19557718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cos(NaN) == NaN");
19657718be8SEnji Cooper }
19757718be8SEnji Cooper 
ATF_TC_BODY(cos_nan,tc)19857718be8SEnji Cooper ATF_TC_BODY(cos_nan, tc)
19957718be8SEnji Cooper {
20057718be8SEnji Cooper 	const double x = 0.0L / 0.0L;
20157718be8SEnji Cooper 
20257718be8SEnji Cooper 	ATF_CHECK(isnan(x) != 0);
20357718be8SEnji Cooper 	ATF_CHECK(isnan(cos(x)) != 0);
20457718be8SEnji Cooper }
20557718be8SEnji Cooper 
20657718be8SEnji Cooper ATF_TC(cos_inf_neg);
ATF_TC_HEAD(cos_inf_neg,tc)20757718be8SEnji Cooper ATF_TC_HEAD(cos_inf_neg, tc)
20857718be8SEnji Cooper {
20957718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cos(-Inf) == NaN");
21057718be8SEnji Cooper }
21157718be8SEnji Cooper 
ATF_TC_BODY(cos_inf_neg,tc)21257718be8SEnji Cooper ATF_TC_BODY(cos_inf_neg, tc)
21357718be8SEnji Cooper {
21457718be8SEnji Cooper 	const double x = -1.0L / 0.0L;
21557718be8SEnji Cooper 
21657718be8SEnji Cooper 	ATF_CHECK(isnan(cos(x)) != 0);
21757718be8SEnji Cooper }
21857718be8SEnji Cooper 
21957718be8SEnji Cooper ATF_TC(cos_inf_pos);
ATF_TC_HEAD(cos_inf_pos,tc)22057718be8SEnji Cooper ATF_TC_HEAD(cos_inf_pos, tc)
22157718be8SEnji Cooper {
22257718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cos(+Inf) == NaN");
22357718be8SEnji Cooper }
22457718be8SEnji Cooper 
ATF_TC_BODY(cos_inf_pos,tc)22557718be8SEnji Cooper ATF_TC_BODY(cos_inf_pos, tc)
22657718be8SEnji Cooper {
22757718be8SEnji Cooper 	const double x = 1.0L / 0.0L;
22857718be8SEnji Cooper 
22957718be8SEnji Cooper 	ATF_CHECK(isnan(cos(x)) != 0);
23057718be8SEnji Cooper }
23157718be8SEnji Cooper 
23257718be8SEnji Cooper 
23357718be8SEnji Cooper ATF_TC(cos_zero_neg);
ATF_TC_HEAD(cos_zero_neg,tc)23457718be8SEnji Cooper ATF_TC_HEAD(cos_zero_neg, tc)
23557718be8SEnji Cooper {
23657718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cos(-0.0) == 1.0");
23757718be8SEnji Cooper }
23857718be8SEnji Cooper 
ATF_TC_BODY(cos_zero_neg,tc)23957718be8SEnji Cooper ATF_TC_BODY(cos_zero_neg, tc)
24057718be8SEnji Cooper {
24157718be8SEnji Cooper 	const double x = -0.0L;
24257718be8SEnji Cooper 
24357718be8SEnji Cooper 	ATF_CHECK(cos(x) == 1.0);
24457718be8SEnji Cooper }
24557718be8SEnji Cooper 
24657718be8SEnji Cooper ATF_TC(cos_zero_pos);
ATF_TC_HEAD(cos_zero_pos,tc)24757718be8SEnji Cooper ATF_TC_HEAD(cos_zero_pos, tc)
24857718be8SEnji Cooper {
24957718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cos(+0.0) == 1.0");
25057718be8SEnji Cooper }
25157718be8SEnji Cooper 
ATF_TC_BODY(cos_zero_pos,tc)25257718be8SEnji Cooper ATF_TC_BODY(cos_zero_pos, tc)
25357718be8SEnji Cooper {
25457718be8SEnji Cooper 	const double x = 0.0L;
25557718be8SEnji Cooper 
25657718be8SEnji Cooper 	ATF_CHECK(cos(x) == 1.0);
25757718be8SEnji Cooper }
25857718be8SEnji Cooper 
25957718be8SEnji Cooper /*
26057718be8SEnji Cooper  * cosf(3)
26157718be8SEnji Cooper  */
26257718be8SEnji Cooper ATF_TC(cosf_angles);
ATF_TC_HEAD(cosf_angles,tc)26357718be8SEnji Cooper ATF_TC_HEAD(cosf_angles, tc)
26457718be8SEnji Cooper {
26557718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test some selected angles");
26657718be8SEnji Cooper }
26757718be8SEnji Cooper 
ATF_TC_BODY(cosf_angles,tc)26857718be8SEnji Cooper ATF_TC_BODY(cosf_angles, tc)
26957718be8SEnji Cooper {
270*1ec3feb6SAlex Richardson 	const float eps = FLT_EPSILON;
27157718be8SEnji Cooper 	size_t i;
27257718be8SEnji Cooper 
27357718be8SEnji Cooper 	for (i = 0; i < __arraycount(angles); i++) {
274*1ec3feb6SAlex Richardson 		int deg = angles[i].angle;
275*1ec3feb6SAlex Richardson 		float theta = angles[i].x;
276*1ec3feb6SAlex Richardson 		float cos_theta = angles[i].fy;
27757718be8SEnji Cooper 
278*1ec3feb6SAlex Richardson 		/*
279*1ec3feb6SAlex Richardson 		 * Force rounding to float even if FLT_EVAL_METHOD=2,
280*1ec3feb6SAlex Richardson 		 * as is the case on i386.
281*1ec3feb6SAlex Richardson 		 *
282*1ec3feb6SAlex Richardson 		 * The volatile should not be necessary, by C99 Sec.
283*1ec3feb6SAlex Richardson 		 * 5.2.4.2.2. para. 8 on p. 24 which specifies that
284*1ec3feb6SAlex Richardson 		 * assignment and cast remove all extra range and precision,
285*1ec3feb6SAlex Richardson 		 * but seems to be needed to work around a compiler bug.
286*1ec3feb6SAlex Richardson 		 */
287*1ec3feb6SAlex Richardson 		volatile float result = cosf(theta);
28857718be8SEnji Cooper 
289*1ec3feb6SAlex Richardson 		if (cos_theta == 999)
290*1ec3feb6SAlex Richardson 			cos_theta = angles[i].y;
291*1ec3feb6SAlex Richardson 
292*1ec3feb6SAlex Richardson 		assert(cos_theta != 0);
293*1ec3feb6SAlex Richardson 		if (!(fabsf((result - cos_theta)/cos_theta) <= eps)) {
294*1ec3feb6SAlex Richardson 			atf_tc_fail_nonfatal("cosf(%d deg = %.8g) = %.8g"
295*1ec3feb6SAlex Richardson 			    " != %.8g", deg, theta, result, cos_theta);
296*1ec3feb6SAlex Richardson 		}
29757718be8SEnji Cooper 	}
29857718be8SEnji Cooper }
29957718be8SEnji Cooper 
30057718be8SEnji Cooper ATF_TC(cosf_nan);
ATF_TC_HEAD(cosf_nan,tc)30157718be8SEnji Cooper ATF_TC_HEAD(cosf_nan, tc)
30257718be8SEnji Cooper {
30357718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cosf(NaN) == NaN");
30457718be8SEnji Cooper }
30557718be8SEnji Cooper 
ATF_TC_BODY(cosf_nan,tc)30657718be8SEnji Cooper ATF_TC_BODY(cosf_nan, tc)
30757718be8SEnji Cooper {
30857718be8SEnji Cooper 	const float x = 0.0L / 0.0L;
30957718be8SEnji Cooper 
31057718be8SEnji Cooper 	ATF_CHECK(isnan(x) != 0);
31157718be8SEnji Cooper 	ATF_CHECK(isnan(cosf(x)) != 0);
31257718be8SEnji Cooper }
31357718be8SEnji Cooper 
31457718be8SEnji Cooper ATF_TC(cosf_inf_neg);
ATF_TC_HEAD(cosf_inf_neg,tc)31557718be8SEnji Cooper ATF_TC_HEAD(cosf_inf_neg, tc)
31657718be8SEnji Cooper {
31757718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cosf(-Inf) == NaN");
31857718be8SEnji Cooper }
31957718be8SEnji Cooper 
ATF_TC_BODY(cosf_inf_neg,tc)32057718be8SEnji Cooper ATF_TC_BODY(cosf_inf_neg, tc)
32157718be8SEnji Cooper {
32257718be8SEnji Cooper 	const float x = -1.0L / 0.0L;
32357718be8SEnji Cooper 
32457718be8SEnji Cooper 	if (isnan(cosf(x)) == 0) {
32557718be8SEnji Cooper 		atf_tc_expect_fail("PR lib/45362");
32657718be8SEnji Cooper 		atf_tc_fail("cosf(-Inf) != NaN");
32757718be8SEnji Cooper 	}
32857718be8SEnji Cooper }
32957718be8SEnji Cooper 
33057718be8SEnji Cooper ATF_TC(cosf_inf_pos);
ATF_TC_HEAD(cosf_inf_pos,tc)33157718be8SEnji Cooper ATF_TC_HEAD(cosf_inf_pos, tc)
33257718be8SEnji Cooper {
33357718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cosf(+Inf) == NaN");
33457718be8SEnji Cooper }
33557718be8SEnji Cooper 
ATF_TC_BODY(cosf_inf_pos,tc)33657718be8SEnji Cooper ATF_TC_BODY(cosf_inf_pos, tc)
33757718be8SEnji Cooper {
33857718be8SEnji Cooper 	const float x = 1.0L / 0.0L;
33957718be8SEnji Cooper 
34057718be8SEnji Cooper 	if (isnan(cosf(x)) == 0) {
34157718be8SEnji Cooper 		atf_tc_expect_fail("PR lib/45362");
34257718be8SEnji Cooper 		atf_tc_fail("cosf(+Inf) != NaN");
34357718be8SEnji Cooper 	}
34457718be8SEnji Cooper }
34557718be8SEnji Cooper 
34657718be8SEnji Cooper 
34757718be8SEnji Cooper ATF_TC(cosf_zero_neg);
ATF_TC_HEAD(cosf_zero_neg,tc)34857718be8SEnji Cooper ATF_TC_HEAD(cosf_zero_neg, tc)
34957718be8SEnji Cooper {
35057718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cosf(-0.0) == 1.0");
35157718be8SEnji Cooper }
35257718be8SEnji Cooper 
ATF_TC_BODY(cosf_zero_neg,tc)35357718be8SEnji Cooper ATF_TC_BODY(cosf_zero_neg, tc)
35457718be8SEnji Cooper {
35557718be8SEnji Cooper 	const float x = -0.0L;
35657718be8SEnji Cooper 
35757718be8SEnji Cooper 	ATF_CHECK(cosf(x) == 1.0);
35857718be8SEnji Cooper }
35957718be8SEnji Cooper 
36057718be8SEnji Cooper ATF_TC(cosf_zero_pos);
ATF_TC_HEAD(cosf_zero_pos,tc)36157718be8SEnji Cooper ATF_TC_HEAD(cosf_zero_pos, tc)
36257718be8SEnji Cooper {
36357718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test cosf(+0.0) == 1.0");
36457718be8SEnji Cooper }
36557718be8SEnji Cooper 
ATF_TC_BODY(cosf_zero_pos,tc)36657718be8SEnji Cooper ATF_TC_BODY(cosf_zero_pos, tc)
36757718be8SEnji Cooper {
36857718be8SEnji Cooper 	const float x = 0.0L;
36957718be8SEnji Cooper 
37057718be8SEnji Cooper 	ATF_CHECK(cosf(x) == 1.0);
37157718be8SEnji Cooper }
37257718be8SEnji Cooper 
ATF_TP_ADD_TCS(tp)37357718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
37457718be8SEnji Cooper {
375*1ec3feb6SAlex Richardson #ifdef __HAVE_LONG_DOUBLE
376*1ec3feb6SAlex Richardson 	ATF_TP_ADD_TC(tp, cosl_angles);
377*1ec3feb6SAlex Richardson 	ATF_TP_ADD_TC(tp, cosl_nan);
378*1ec3feb6SAlex Richardson 	ATF_TP_ADD_TC(tp, cosl_inf_neg);
379*1ec3feb6SAlex Richardson 	ATF_TP_ADD_TC(tp, cosl_inf_pos);
380*1ec3feb6SAlex Richardson 	ATF_TP_ADD_TC(tp, cosl_zero_neg);
381*1ec3feb6SAlex Richardson 	ATF_TP_ADD_TC(tp, cosl_zero_pos);
382*1ec3feb6SAlex Richardson #endif
38357718be8SEnji Cooper 
38457718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cos_angles);
38557718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cos_nan);
38657718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cos_inf_neg);
38757718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cos_inf_pos);
38857718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cos_zero_neg);
38957718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cos_zero_pos);
39057718be8SEnji Cooper 
39157718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cosf_angles);
39257718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cosf_nan);
39357718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cosf_inf_neg);
39457718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cosf_inf_pos);
39557718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cosf_zero_neg);
39657718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, cosf_zero_pos);
39757718be8SEnji Cooper 
39857718be8SEnji Cooper 	return atf_no_error();
39957718be8SEnji Cooper }
400