xref: /netbsd-src/tests/lib/libm/t_modf.c (revision 906e271cb392171a4b91e8a35d76013244a2813f)
1*906e271cSriastradh /*	$NetBSD: t_modf.c,v 1.6 2024/05/15 00:02:57 riastradh Exp $	*/
213b8fa7dSjoerg 
313b8fa7dSjoerg /*-
413b8fa7dSjoerg  * Copyright (c) 2014 The NetBSD Foundation, Inc.
513b8fa7dSjoerg  * All rights reserved.
613b8fa7dSjoerg  *
713b8fa7dSjoerg  * This code is derived from software contributed to The NetBSD Foundation
813b8fa7dSjoerg  * by Joerg Sonnenberger.
913b8fa7dSjoerg  *
1013b8fa7dSjoerg  * Redistribution and use in source and binary forms, with or without
1113b8fa7dSjoerg  * modification, are permitted provided that the following conditions
1213b8fa7dSjoerg  * are met:
1313b8fa7dSjoerg  * 1. Redistributions of source code must retain the above copyright
1413b8fa7dSjoerg  *    notice, this list of conditions and the following disclaimer.
1513b8fa7dSjoerg  * 2. Redistributions in binary form must reproduce the above copyright
1613b8fa7dSjoerg  *    notice, this list of conditions and the following disclaimer in the
1713b8fa7dSjoerg  *    documentation and/or other materials provided with the distribution.
1813b8fa7dSjoerg  *
1913b8fa7dSjoerg  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2013b8fa7dSjoerg  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2113b8fa7dSjoerg  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2213b8fa7dSjoerg  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2313b8fa7dSjoerg  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2413b8fa7dSjoerg  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2513b8fa7dSjoerg  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2613b8fa7dSjoerg  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2713b8fa7dSjoerg  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2813b8fa7dSjoerg  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2913b8fa7dSjoerg  * POSSIBILITY OF SUCH DAMAGE.
3013b8fa7dSjoerg  */
3113b8fa7dSjoerg 
32a2c1cc7dSriastradh #include <sys/cdefs.h>
33*906e271cSriastradh __RCSID("$NetBSD: t_modf.c,v 1.6 2024/05/15 00:02:57 riastradh Exp $");
34a2c1cc7dSriastradh 
3513b8fa7dSjoerg #include <atf-c.h>
3613b8fa7dSjoerg #include <float.h>
3713b8fa7dSjoerg #include <math.h>
3813b8fa7dSjoerg 
39a2c1cc7dSriastradh __CTASSERT(FLT_RADIX == 2);
40a2c1cc7dSriastradh 
41a2c1cc7dSriastradh static const struct {
42a2c1cc7dSriastradh 	float x, i, f;
43a2c1cc7dSriastradh } casesf[] = {
44a2c1cc7dSriastradh 	{ 0, 0, 0 },
45a2c1cc7dSriastradh 	{ FLT_MIN, 0, FLT_MIN },
46a2c1cc7dSriastradh 	{ 0.5, 0, 0.5 },
47a2c1cc7dSriastradh 	{ 1 - FLT_EPSILON/2, 0, 1 - FLT_EPSILON/2 },
48a2c1cc7dSriastradh 	{ 1, 1, 0 },
49a2c1cc7dSriastradh 	{ 1 + FLT_EPSILON, 1, FLT_EPSILON },
50a2c1cc7dSriastradh 	{ 0.5/FLT_EPSILON - 0.5, 0.5/FLT_EPSILON - 1, 0.5 },
51a2c1cc7dSriastradh 	{ 0.5/FLT_EPSILON, 0.5/FLT_EPSILON, 0 },
52a2c1cc7dSriastradh 	{ 0.5/FLT_EPSILON + 0.5, 0.5/FLT_EPSILON, 0.5 },
53a2c1cc7dSriastradh 	{ 1/FLT_EPSILON, 1/FLT_EPSILON, 0 },
54a2c1cc7dSriastradh };
55a2c1cc7dSriastradh 
56a2c1cc7dSriastradh static const struct {
57a2c1cc7dSriastradh 	double x, i, f;
58a2c1cc7dSriastradh } cases[] = {
59a2c1cc7dSriastradh 	{ 0, 0, 0 },
60a2c1cc7dSriastradh 	{ DBL_MIN, 0, DBL_MIN },
61a2c1cc7dSriastradh 	{ 0.5, 0, 0.5 },
62a2c1cc7dSriastradh 	{ 1 - DBL_EPSILON/2, 0, 1 - DBL_EPSILON/2 },
63a2c1cc7dSriastradh 	{ 1, 1, 0 },
64a2c1cc7dSriastradh 	{ 1 + DBL_EPSILON, 1, DBL_EPSILON },
65a2c1cc7dSriastradh 	{ 1/FLT_EPSILON + 0.5, 1/FLT_EPSILON, 0.5 },
66a2c1cc7dSriastradh 	{ 0.5/DBL_EPSILON - 0.5, 0.5/DBL_EPSILON - 1, 0.5 },
67a2c1cc7dSriastradh 	{ 0.5/DBL_EPSILON, 0.5/DBL_EPSILON, 0 },
68a2c1cc7dSriastradh 	{ 0.5/DBL_EPSILON + 0.5, 0.5/DBL_EPSILON, 0.5 },
69a2c1cc7dSriastradh 	{ 1/DBL_EPSILON, 1/DBL_EPSILON, 0 },
70a2c1cc7dSriastradh };
71a2c1cc7dSriastradh 
72a2c1cc7dSriastradh #ifdef __HAVE_LONG_DOUBLE
73a2c1cc7dSriastradh static const struct {
74a2c1cc7dSriastradh 	long double x, i, f;
75a2c1cc7dSriastradh } casesl[] = {
76a2c1cc7dSriastradh 	{ 0, 0, 0 },
77a2c1cc7dSriastradh 	{ LDBL_MIN, 0, LDBL_MIN },
78a2c1cc7dSriastradh 	{ 0.5, 0, 0.5 },
79a2c1cc7dSriastradh 	{ 1 - LDBL_EPSILON/2, 0, 1 - LDBL_EPSILON/2 },
80a2c1cc7dSriastradh 	{ 1, 1, 0 },
81a2c1cc7dSriastradh 	{ 1 + LDBL_EPSILON, 1, LDBL_EPSILON },
82a2c1cc7dSriastradh 	{ 1.0L/DBL_EPSILON + 0.5L, 1.0L/DBL_EPSILON, 0.5 },
83a2c1cc7dSriastradh 	{ 0.5/LDBL_EPSILON - 0.5L, 0.5/LDBL_EPSILON - 1, 0.5 },
84a2c1cc7dSriastradh 	{ 0.5/LDBL_EPSILON, 0.5/LDBL_EPSILON, 0 },
85a2c1cc7dSriastradh 	{ 0.5/LDBL_EPSILON + 0.5L, 0.5/LDBL_EPSILON, 0.5 },
86a2c1cc7dSriastradh 	{ 1/LDBL_EPSILON, 1/LDBL_EPSILON, 0 },
87a2c1cc7dSriastradh };
88a2c1cc7dSriastradh #endif	/* __HAVE_LONG_DOUBLE */
89a2c1cc7dSriastradh 
90a2c1cc7dSriastradh ATF_TC(modff);
ATF_TC_HEAD(modff,tc)91a2c1cc7dSriastradh ATF_TC_HEAD(modff, tc)
92a2c1cc7dSriastradh {
93a2c1cc7dSriastradh 	atf_tc_set_md_var(tc, "descr", "modff(3)");
94a2c1cc7dSriastradh }
ATF_TC_BODY(modff,tc)95a2c1cc7dSriastradh ATF_TC_BODY(modff, tc)
96a2c1cc7dSriastradh {
97a2c1cc7dSriastradh 	unsigned n;
98a2c1cc7dSriastradh 
99a2c1cc7dSriastradh 	for (n = 0; n < __arraycount(casesf); n++) {
100a2c1cc7dSriastradh 		float x, i, f;
101a2c1cc7dSriastradh 
102a2c1cc7dSriastradh 		x = casesf[n].x;
103a2c1cc7dSriastradh 		f = modff(x, &i);
104a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, casesf[n].i,
105a2c1cc7dSriastradh 		    "casesf[%u]: modff %g=%a"
106a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
107a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
108a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
109a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
110a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, casesf[n].f,
111a2c1cc7dSriastradh 		    "casesf[%u]: modff %g=%a"
112a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
113a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
114a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
115a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
116a2c1cc7dSriastradh 
117a2c1cc7dSriastradh 		f = modff(-x, &i);
118a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, -casesf[n].i,
119a2c1cc7dSriastradh 		    "casesf[%u]: modff %g=%a"
120a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
121a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
122a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
123a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
124a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, -casesf[n].f,
125a2c1cc7dSriastradh 		    "casesf[%u]: modff %g=%a"
126a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
127a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
128a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
129a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
130a2c1cc7dSriastradh 	}
131a2c1cc7dSriastradh 
13210d47f33Sriastradh 	if (isinf(INFINITY)) {
133a2c1cc7dSriastradh 		float x, i, f;
134a2c1cc7dSriastradh 
135a2c1cc7dSriastradh 		x = INFINITY;
136a2c1cc7dSriastradh 		f = modff(x, &i);
137a2c1cc7dSriastradh 		ATF_CHECK_MSG(f == 0,
138a2c1cc7dSriastradh 		    "modff +inf returned integer %g=%a, frac %g=%a",
139a2c1cc7dSriastradh 		    i, i, f, f);
1408ae99964Sriastradh 		ATF_CHECK_MSG(isinf(i) && i > 0,
141a2c1cc7dSriastradh 		    "modff +inf returned integer %g=%a, frac %g=%a",
142a2c1cc7dSriastradh 		    i, i, f, f);
143a2c1cc7dSriastradh 
144a2c1cc7dSriastradh 		x = -INFINITY;
145a2c1cc7dSriastradh 		f = modff(x, &i);
146a2c1cc7dSriastradh 		ATF_CHECK_MSG(f == 0,
147a2c1cc7dSriastradh 		    "modff -inf returned integer %g=%a, frac %g=%a",
148a2c1cc7dSriastradh 		    i, i, f, f);
1498ae99964Sriastradh 		ATF_CHECK_MSG(isinf(i) && i < 0,
150a2c1cc7dSriastradh 		    "modff -inf returned integer %g=%a, frac %g=%a",
151a2c1cc7dSriastradh 		    i, i, f, f);
152a2c1cc7dSriastradh 	}
153a2c1cc7dSriastradh 
154a2c1cc7dSriastradh #ifdef NAN
155a2c1cc7dSriastradh 	{
156a2c1cc7dSriastradh 		float x, i, f;
157a2c1cc7dSriastradh 
158a2c1cc7dSriastradh 		x = NAN;
159a2c1cc7dSriastradh 		f = modff(x, &i);
160a2c1cc7dSriastradh 		ATF_CHECK_MSG(isnan(f),
161a2c1cc7dSriastradh 		    "modff NaN returned integer %g=%a, frac %g=%a",
162a2c1cc7dSriastradh 		    i, i, f, f);
163a2c1cc7dSriastradh 		ATF_CHECK_MSG(isnan(i),
164a2c1cc7dSriastradh 		    "modff NaN returned integer %g=%a, frac %g=%a",
165a2c1cc7dSriastradh 		    i, i, f, f);
166a2c1cc7dSriastradh 	}
167a2c1cc7dSriastradh #endif	/* NAN */
168a2c1cc7dSriastradh }
169a2c1cc7dSriastradh 
17013b8fa7dSjoerg ATF_TC(modf);
ATF_TC_HEAD(modf,tc)17113b8fa7dSjoerg ATF_TC_HEAD(modf, tc)
17213b8fa7dSjoerg {
173a2c1cc7dSriastradh 	atf_tc_set_md_var(tc, "descr", "modf(3)");
17413b8fa7dSjoerg }
ATF_TC_BODY(modf,tc)17513b8fa7dSjoerg ATF_TC_BODY(modf, tc)
17613b8fa7dSjoerg {
177a2c1cc7dSriastradh 	unsigned n;
17813b8fa7dSjoerg 
179a2c1cc7dSriastradh 	for (n = 0; n < __arraycount(casesf); n++) {
180a2c1cc7dSriastradh 		double x, i, f;
181a2c1cc7dSriastradh 
182a2c1cc7dSriastradh 		x = casesf[n].x;
183a2c1cc7dSriastradh 		f = modf(x, &i);
184a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, casesf[n].i,
185a2c1cc7dSriastradh 		    "casesf[%u]: modf %g=%a"
186a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
187a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
188a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
189a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
190a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, casesf[n].f,
191a2c1cc7dSriastradh 		    "casesf[%u]: modf %g=%a"
192a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
193a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
194a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
195a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
196a2c1cc7dSriastradh 
197a2c1cc7dSriastradh 		f = modf(-x, &i);
198a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, -casesf[n].i,
199a2c1cc7dSriastradh 		    "casesf[%u]: modf %g=%a"
200a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
201a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
202a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
203a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
204a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, -casesf[n].f,
205a2c1cc7dSriastradh 		    "casesf[%u]: modf %g=%a"
206a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
207a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
208a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
209a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
210a2c1cc7dSriastradh 	}
211a2c1cc7dSriastradh 
212a2c1cc7dSriastradh 	for (n = 0; n < __arraycount(cases); n++) {
213a2c1cc7dSriastradh 		double x, i, f;
214a2c1cc7dSriastradh 
215a2c1cc7dSriastradh 		x = cases[n].x;
216a2c1cc7dSriastradh 		f = modf(x, &i);
217a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, cases[n].i,
218a2c1cc7dSriastradh 		    "cases[%u]: modf %g=%a"
219a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
220a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
221a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
222a2c1cc7dSriastradh 		    cases[n].i, cases[n].i, cases[n].f, cases[n].f);
223a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, cases[n].f,
224a2c1cc7dSriastradh 		    "cases[%u]: modf %g=%a"
225a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
226a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
227a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
228a2c1cc7dSriastradh 		    cases[n].i, cases[n].i, cases[n].f, cases[n].f);
229a2c1cc7dSriastradh 
230a2c1cc7dSriastradh 		f = modf(-x, &i);
231a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, -cases[n].i,
232a2c1cc7dSriastradh 		    "cases[%u]: modf %g=%a"
233a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
234a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
235a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
236a2c1cc7dSriastradh 		    cases[n].i, cases[n].i, cases[n].f, cases[n].f);
237a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, -cases[n].f,
238a2c1cc7dSriastradh 		    "cases[%u]: modf %g=%a"
239a2c1cc7dSriastradh 		    " returned integer %g=%a, frac %g=%a;"
240a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
241a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
242a2c1cc7dSriastradh 		    cases[n].i, cases[n].i, cases[n].f, cases[n].f);
243a2c1cc7dSriastradh 	}
244a2c1cc7dSriastradh 
24510d47f33Sriastradh 	if (isinf(INFINITY)) {
246a2c1cc7dSriastradh 		double x, i, f;
247a2c1cc7dSriastradh 
248a2c1cc7dSriastradh 		x = INFINITY;
249a2c1cc7dSriastradh 		f = modf(x, &i);
250a2c1cc7dSriastradh 		ATF_CHECK_MSG(f == 0,
251a2c1cc7dSriastradh 		    "modf +inf returned integer %g=%a, frac %g=%a",
252a2c1cc7dSriastradh 		    i, i, f, f);
2538ae99964Sriastradh 		ATF_CHECK_MSG(isinf(i) && i > 0,
254a2c1cc7dSriastradh 		    "modf +inf returned integer %g=%a, frac %g=%a",
255a2c1cc7dSriastradh 		    i, i, f, f);
256a2c1cc7dSriastradh 
257a2c1cc7dSriastradh 		x = -INFINITY;
258a2c1cc7dSriastradh 		f = modf(x, &i);
259a2c1cc7dSriastradh 		ATF_CHECK_MSG(f == 0,
260a2c1cc7dSriastradh 		    "modf -inf returned integer %g=%a, frac %g=%a",
261a2c1cc7dSriastradh 		    i, i, f, f);
2628ae99964Sriastradh 		ATF_CHECK_MSG(isinf(i) && i < 0,
263a2c1cc7dSriastradh 		    "modf -inf returned integer %g=%a, frac %g=%a",
264a2c1cc7dSriastradh 		    i, i, f, f);
265a2c1cc7dSriastradh 	}
266a2c1cc7dSriastradh 
267a2c1cc7dSriastradh #ifdef NAN
268a2c1cc7dSriastradh 	{
269a2c1cc7dSriastradh 		double x, i, f;
270a2c1cc7dSriastradh 
271a2c1cc7dSriastradh 		x = NAN;
272a2c1cc7dSriastradh 		f = modf(x, &i);
273a2c1cc7dSriastradh 		ATF_CHECK_MSG(isnan(f),
274a2c1cc7dSriastradh 		    "modf NaN returned integer %g=%a, frac %g=%a",
275a2c1cc7dSriastradh 		    i, i, f, f);
276a2c1cc7dSriastradh 		ATF_CHECK_MSG(isnan(i),
277a2c1cc7dSriastradh 		    "modf NaN returned integer %g=%a, frac %g=%a",
278a2c1cc7dSriastradh 		    i, i, f, f);
279a2c1cc7dSriastradh 	}
280a2c1cc7dSriastradh #endif	/* NAN */
281a2c1cc7dSriastradh }
282a2c1cc7dSriastradh 
283a2c1cc7dSriastradh ATF_TC(modfl);
ATF_TC_HEAD(modfl,tc)284a2c1cc7dSriastradh ATF_TC_HEAD(modfl, tc)
285a2c1cc7dSriastradh {
286a2c1cc7dSriastradh 	atf_tc_set_md_var(tc, "descr", "modfl(3)");
287a2c1cc7dSriastradh }
ATF_TC_BODY(modfl,tc)288a2c1cc7dSriastradh ATF_TC_BODY(modfl, tc)
289a2c1cc7dSriastradh {
290a2c1cc7dSriastradh 	unsigned n;
291a2c1cc7dSriastradh 
292a2c1cc7dSriastradh 	for (n = 0; n < __arraycount(casesf); n++) {
293a2c1cc7dSriastradh 		long double x, i, f;
294a2c1cc7dSriastradh 
295a2c1cc7dSriastradh 		x = casesf[n].x;
296a2c1cc7dSriastradh 		f = modfl(x, &i);
297a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, casesf[n].i,
298a2c1cc7dSriastradh 		    "casesf[%u]: modfl %Lg=%La"
299a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
300a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
301a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
302a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
303a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, casesf[n].f,
304a2c1cc7dSriastradh 		    "casesf[%u]: modfl %Lg=%La"
305a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
306a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
307a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
308a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
309a2c1cc7dSriastradh 
310a2c1cc7dSriastradh 		f = modfl(-x, &i);
311a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, -casesf[n].i,
312a2c1cc7dSriastradh 		    "casesf[%u]: modfl %Lg=%La"
313a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
314a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
315a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
316a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
317a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, -casesf[n].f,
318a2c1cc7dSriastradh 		    "casesf[%u]: modfl %Lg=%La"
319a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
320a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
321a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
322a2c1cc7dSriastradh 		    casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
323a2c1cc7dSriastradh 	}
324a2c1cc7dSriastradh 
325a2c1cc7dSriastradh 	for (n = 0; n < __arraycount(cases); n++) {
326a2c1cc7dSriastradh 		long double x, i, f;
327a2c1cc7dSriastradh 
328a2c1cc7dSriastradh 		x = cases[n].x;
329a2c1cc7dSriastradh 		f = modfl(x, &i);
330a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, cases[n].i,
331a2c1cc7dSriastradh 		    "cases[%u]: modfl %Lg=%La"
332a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
333a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
334a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
335a2c1cc7dSriastradh 		    cases[n].i, cases[n].i, cases[n].f, cases[n].f);
336a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, cases[n].f,
337a2c1cc7dSriastradh 		    "cases[%u]: modfl %Lg=%La"
338a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
339a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
340a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
341a2c1cc7dSriastradh 		    cases[n].i, cases[n].i, cases[n].f, cases[n].f);
342a2c1cc7dSriastradh 
343a2c1cc7dSriastradh 		f = modfl(-x, &i);
344a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, -cases[n].i,
345a2c1cc7dSriastradh 		    "cases[%u]: modfl %Lg=%La"
346a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
347a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
348a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
349a2c1cc7dSriastradh 		    cases[n].i, cases[n].i, cases[n].f, cases[n].f);
350a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, -cases[n].f,
351a2c1cc7dSriastradh 		    "cases[%u]: modfl %Lg=%La"
352a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
353a2c1cc7dSriastradh 		    " expected integer %g=%a, frac %g=%a",
354a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
355a2c1cc7dSriastradh 		    cases[n].i, cases[n].i, cases[n].f, cases[n].f);
356a2c1cc7dSriastradh 	}
357a2c1cc7dSriastradh 
358a2c1cc7dSriastradh #ifdef __HAVE_LONG_DOUBLE
359a2c1cc7dSriastradh 	for (n = 0; n < __arraycount(casesl); n++) {
360a2c1cc7dSriastradh 		long double x, i, f;
361a2c1cc7dSriastradh 
362a2c1cc7dSriastradh 		x = casesl[n].x;
363a2c1cc7dSriastradh 		f = modfl(x, &i);
364a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, casesl[n].i,
365a2c1cc7dSriastradh 		    "casesl[%u]: modfl %Lg=%La"
366a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
367a2c1cc7dSriastradh 		    " expected integer %Lg=%La, frac %Lg=%La",
368a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
369a2c1cc7dSriastradh 		    casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f);
370a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, casesl[n].f,
371a2c1cc7dSriastradh 		    "casesl[%u]: modfl %Lg=%La"
372a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
373a2c1cc7dSriastradh 		    " expected integer %Lg=%La, frac %Lg=%La",
374a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
375a2c1cc7dSriastradh 		    casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f);
376a2c1cc7dSriastradh 
377a2c1cc7dSriastradh 		f = modfl(-x, &i);
378a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(i, -casesl[n].i,
379a2c1cc7dSriastradh 		    "casesl[%u]: modfl %Lg=%La"
380a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
381a2c1cc7dSriastradh 		    " expected integer %Lg=%La, frac %Lg=%La",
382a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
383a2c1cc7dSriastradh 		    casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f);
384a2c1cc7dSriastradh 		ATF_CHECK_EQ_MSG(f, -casesl[n].f,
385a2c1cc7dSriastradh 		    "casesl[%u]: modfl %Lg=%La"
386a2c1cc7dSriastradh 		    " returned integer %Lg=%La, frac %Lg=%La;"
387a2c1cc7dSriastradh 		    " expected integer %Lg=%La, frac %Lg=%La",
388a2c1cc7dSriastradh 		    n, x, x, i, i, f, f,
389a2c1cc7dSriastradh 		    casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f);
390a2c1cc7dSriastradh 	}
391a2c1cc7dSriastradh #endif	/* __HAVE_LONG_DOUBLE */
392a2c1cc7dSriastradh 
39310d47f33Sriastradh 	if (isinf(INFINITY)) {
394a2c1cc7dSriastradh 		long double x, i, f;
395a2c1cc7dSriastradh 
396a2c1cc7dSriastradh 		x = INFINITY;
397a2c1cc7dSriastradh 		f = modfl(x, &i);
398a2c1cc7dSriastradh 		ATF_CHECK_MSG(f == 0,
399a2c1cc7dSriastradh 		    "modfl +inf returned integer %Lg=%La, frac %Lg=%La",
400a2c1cc7dSriastradh 		    i, i, f, f);
4018ae99964Sriastradh 		ATF_CHECK_MSG(isinf(i) && i > 0,
402a2c1cc7dSriastradh 		    "modfl +inf returned integer %Lg=%La, frac %Lg=%La",
403a2c1cc7dSriastradh 		    i, i, f, f);
404a2c1cc7dSriastradh 
405a2c1cc7dSriastradh 		x = -INFINITY;
406a2c1cc7dSriastradh 		f = modfl(x, &i);
407a2c1cc7dSriastradh 		ATF_CHECK_MSG(f == 0,
408a2c1cc7dSriastradh 		    "modfl -inf returned integer %Lg=%La, frac %Lg=%La",
409a2c1cc7dSriastradh 		    i, i, f, f);
4108ae99964Sriastradh 		ATF_CHECK_MSG(isinf(i) && i < 0,
411a2c1cc7dSriastradh 		    "modfl -inf returned integer %Lg=%La, frac %Lg=%La",
412a2c1cc7dSriastradh 		    i, i, f, f);
413a2c1cc7dSriastradh 	}
414a2c1cc7dSriastradh 
415a2c1cc7dSriastradh #ifdef NAN
416a2c1cc7dSriastradh 	{
417a2c1cc7dSriastradh 		long double x, i, f;
418a2c1cc7dSriastradh 
419a2c1cc7dSriastradh 		x = NAN;
420a2c1cc7dSriastradh 		f = modfl(x, &i);
421a2c1cc7dSriastradh 		ATF_CHECK_MSG(isnan(f),
422a2c1cc7dSriastradh 		    "modfl NaN returned integer %Lg=%La, frac %Lg=%La",
423a2c1cc7dSriastradh 		    i, i, f, f);
424a2c1cc7dSriastradh 		ATF_CHECK_MSG(isnan(i),
425a2c1cc7dSriastradh 		    "modfl NaN returned integer %Lg=%La, frac %Lg=%La",
426a2c1cc7dSriastradh 		    i, i, f, f);
427a2c1cc7dSriastradh 	}
42810d47f33Sriastradh #endif	/* NAN */
42913b8fa7dSjoerg }
43013b8fa7dSjoerg 
ATF_TP_ADD_TCS(tp)43113b8fa7dSjoerg ATF_TP_ADD_TCS(tp)
43213b8fa7dSjoerg {
43313b8fa7dSjoerg 
434a2c1cc7dSriastradh 	ATF_TP_ADD_TC(tp, modff);
43513b8fa7dSjoerg 	ATF_TP_ADD_TC(tp, modf);
436a2c1cc7dSriastradh 	ATF_TP_ADD_TC(tp, modfl);
43713b8fa7dSjoerg 
43813b8fa7dSjoerg 	return atf_no_error();
43913b8fa7dSjoerg }
440