xref: /netbsd-src/tests/lib/libm/t_hypot.c (revision 7e2cd5d094cc1755df05b9cf1ae8b3b65024995b)
1*7e2cd5d0Srillig /* $NetBSD: t_hypot.c,v 1.8 2024/05/13 20:28:15 rillig Exp $ */
2e9eb083cSgson 
3e9eb083cSgson /*-
4e9eb083cSgson  * Copyright (c) 2016 The NetBSD Foundation, Inc.
5e9eb083cSgson  * All rights reserved.
6e9eb083cSgson  *
7e9eb083cSgson  * Redistribution and use in source and binary forms, with or without
8e9eb083cSgson  * modification, are permitted provided that the following conditions
9e9eb083cSgson  * are met:
10e9eb083cSgson  * 1. Redistributions of source code must retain the above copyright
11e9eb083cSgson  *    notice, this list of conditions and the following disclaimer.
12e9eb083cSgson  * 2. Redistributions in binary form must reproduce the above copyright
13e9eb083cSgson  *    notice, this list of conditions and the following disclaimer in the
14e9eb083cSgson  *    documentation and/or other materials provided with the distribution.
15e9eb083cSgson  *
16e9eb083cSgson  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17e9eb083cSgson  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18e9eb083cSgson  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19e9eb083cSgson  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20e9eb083cSgson  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21e9eb083cSgson  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22e9eb083cSgson  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23e9eb083cSgson  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24e9eb083cSgson  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25e9eb083cSgson  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26e9eb083cSgson  * POSSIBILITY OF SUCH DAMAGE.
27e9eb083cSgson  */
28e9eb083cSgson 
29e9eb083cSgson #include <atf-c.h>
303331daffSriastradh #include <float.h>
31e9eb083cSgson #include <math.h>
32e9eb083cSgson 
333331daffSriastradh #define	CHECK_EQ(i, hypot, a, b, c)					      \
343331daffSriastradh 	ATF_CHECK_MSG(hypot(a, b) == (c),				      \
353331daffSriastradh 	    "[%u] %s(%a, %a)=%a, expected %a",				      \
363331daffSriastradh 	    (i), #hypot, (a), (b), hypot(a, b), (c))
373331daffSriastradh 
383331daffSriastradh #define	CHECKL_EQ(i, hypot, a, b, c)					      \
393331daffSriastradh 	ATF_CHECK_MSG(hypot(a, b) == (c),				      \
403331daffSriastradh 	    "[%u] %s(%La, %La)=%La, expected %La",			      \
41d2baffa5Sriastradh 	    (i), #hypot, (long double)(a), (long double)(b), hypot(a, b),     \
42d2baffa5Sriastradh 	    (long double)(c))
43d2baffa5Sriastradh 
44d2baffa5Sriastradh #define	CHECK_NAN(i, hypot, a, b)					      \
45d2baffa5Sriastradh 	ATF_CHECK_MSG(isnan(hypot(a, b)),				      \
46d2baffa5Sriastradh 	    "[%u] %s(%a, %a)=%a, expected NaN",				      \
47d2baffa5Sriastradh 	    (i), #hypot, (a), (b), hypot(a, b))
48d2baffa5Sriastradh 
49d2baffa5Sriastradh #define	CHECKL_NAN(i, hypot, a, b)					      \
50d2baffa5Sriastradh 	ATF_CHECK_MSG(isnan(hypot(a, b)),				      \
51d2baffa5Sriastradh 	    "[%u] %s(%La, %La)=%La, expected NaN",			      \
52d2baffa5Sriastradh 	    (i), #hypot, (long double)(a), (long double)(b), hypot(a, b))
533331daffSriastradh 
543331daffSriastradh static const float trivial_casesf[] = {
553331daffSriastradh 	0,
563331daffSriastradh #ifdef __FLT_HAS_DENORM__
573331daffSriastradh 	__FLT_DENORM_MIN__,
583331daffSriastradh 	2*__FLT_DENORM_MIN__,
593331daffSriastradh 	3*__FLT_DENORM_MIN__,
603331daffSriastradh 	FLT_MIN - 3*__FLT_DENORM_MIN__,
613331daffSriastradh 	FLT_MIN - 2*__FLT_DENORM_MIN__,
623331daffSriastradh 	FLT_MIN - __FLT_DENORM_MIN__,
633331daffSriastradh #endif
643331daffSriastradh 	FLT_MIN,
653331daffSriastradh 	FLT_MIN*(1 + FLT_EPSILON),
663331daffSriastradh 	FLT_MIN*(1 + 2*FLT_EPSILON),
673331daffSriastradh 	2*FLT_MIN,
683331daffSriastradh 	FLT_EPSILON/2,
693331daffSriastradh 	FLT_EPSILON,
703331daffSriastradh 	2*FLT_EPSILON,
713331daffSriastradh 	1 - 3*FLT_EPSILON/2,
723331daffSriastradh 	1 - 2*FLT_EPSILON/2,
733331daffSriastradh 	1 - FLT_EPSILON/2,
743331daffSriastradh 	1,
753331daffSriastradh 	1 + FLT_EPSILON,
763331daffSriastradh 	1 + 2*FLT_EPSILON,
773331daffSriastradh 	1 + 3*FLT_EPSILON,
783331daffSriastradh 	1.5 - 3*FLT_EPSILON,
793331daffSriastradh 	1.5 - 2*FLT_EPSILON,
803331daffSriastradh 	1.5 - FLT_EPSILON,
813331daffSriastradh 	1.5,
823331daffSriastradh 	1.5 + FLT_EPSILON,
833331daffSriastradh 	1.5 + 2*FLT_EPSILON,
843331daffSriastradh 	1.5 + 3*FLT_EPSILON,
853331daffSriastradh 	2,
863331daffSriastradh 	0.5/FLT_EPSILON - 0.5,
873331daffSriastradh 	0.5/FLT_EPSILON,
883331daffSriastradh 	0.5/FLT_EPSILON + 0.5,
893331daffSriastradh 	1/FLT_EPSILON,
903331daffSriastradh 	FLT_MAX,
913331daffSriastradh 	INFINITY,
923331daffSriastradh };
933331daffSriastradh 
943331daffSriastradh static const double trivial_cases[] = {
953331daffSriastradh 	0,
963331daffSriastradh #ifdef __DBL_HAS_DENORM__
973331daffSriastradh 	__DBL_DENORM_MIN__,
983331daffSriastradh 	2*__DBL_DENORM_MIN__,
993331daffSriastradh 	3*__DBL_DENORM_MIN__,
1003331daffSriastradh 	DBL_MIN - 3*__DBL_DENORM_MIN__,
1013331daffSriastradh 	DBL_MIN - 2*__DBL_DENORM_MIN__,
1023331daffSriastradh 	DBL_MIN - __DBL_DENORM_MIN__,
1033331daffSriastradh #endif
1043331daffSriastradh 	DBL_MIN,
1053331daffSriastradh 	DBL_MIN*(1 + DBL_EPSILON),
1063331daffSriastradh 	DBL_MIN*(1 + 2*DBL_EPSILON),
1073331daffSriastradh 	2*DBL_MIN,
1083331daffSriastradh 	DBL_EPSILON/2,
1093331daffSriastradh 	DBL_EPSILON,
1103331daffSriastradh 	2*DBL_EPSILON,
1113331daffSriastradh 	1 - 3*DBL_EPSILON/2,
1123331daffSriastradh 	1 - 2*DBL_EPSILON/2,
1133331daffSriastradh 	1 - DBL_EPSILON/2,
1143331daffSriastradh 	1,
1153331daffSriastradh 	1 + DBL_EPSILON,
1163331daffSriastradh 	1 + 2*DBL_EPSILON,
1173331daffSriastradh 	1 + 3*DBL_EPSILON,
1183331daffSriastradh 	1.5 - 3*DBL_EPSILON,
1193331daffSriastradh 	1.5 - 2*DBL_EPSILON,
1203331daffSriastradh 	1.5 - DBL_EPSILON,
1213331daffSriastradh 	1.5,
1223331daffSriastradh 	1.5 + DBL_EPSILON,
1233331daffSriastradh 	1.5 + 2*DBL_EPSILON,
1243331daffSriastradh 	1.5 + 3*DBL_EPSILON,
1253331daffSriastradh 	2,
1263331daffSriastradh 	1/FLT_EPSILON - 0.5,
1273331daffSriastradh 	1/FLT_EPSILON,
1283331daffSriastradh 	1/FLT_EPSILON + 0.5,
1293331daffSriastradh 	0.5/DBL_EPSILON - 0.5,
1303331daffSriastradh 	0.5/DBL_EPSILON,
1313331daffSriastradh 	0.5/DBL_EPSILON + 0.5,
1323331daffSriastradh 	1/DBL_EPSILON,
1333331daffSriastradh 	DBL_MAX,
1343331daffSriastradh 	INFINITY,
1353331daffSriastradh };
1363331daffSriastradh 
1373331daffSriastradh static const long double trivial_casesl[] = {
1383331daffSriastradh 	0,
1393331daffSriastradh #ifdef __LDBL_HAS_DENORM__
1403331daffSriastradh 	__LDBL_DENORM_MIN__,
1413331daffSriastradh 	2*__LDBL_DENORM_MIN__,
1423331daffSriastradh 	3*__LDBL_DENORM_MIN__,
1433331daffSriastradh 	LDBL_MIN - 3*__LDBL_DENORM_MIN__,
1443331daffSriastradh 	LDBL_MIN - 2*__LDBL_DENORM_MIN__,
1453331daffSriastradh 	LDBL_MIN - __LDBL_DENORM_MIN__,
1463331daffSriastradh #endif
1473331daffSriastradh 	LDBL_MIN,
1483331daffSriastradh 	LDBL_MIN*(1 + LDBL_EPSILON),
1493331daffSriastradh 	LDBL_MIN*(1 + 2*LDBL_EPSILON),
1503331daffSriastradh 	2*LDBL_MIN,
1513331daffSriastradh 	LDBL_EPSILON/2,
1523331daffSriastradh 	LDBL_EPSILON,
1533331daffSriastradh 	2*LDBL_EPSILON,
1543331daffSriastradh 	1 - 3*LDBL_EPSILON/2,
1553331daffSriastradh 	1 - 2*LDBL_EPSILON/2,
1563331daffSriastradh 	1 - LDBL_EPSILON/2,
1573331daffSriastradh 	1,
1583331daffSriastradh 	1 + LDBL_EPSILON,
1593331daffSriastradh 	1 + 2*LDBL_EPSILON,
1603331daffSriastradh 	1 + 3*LDBL_EPSILON,
1613331daffSriastradh 	1.5 - 3*LDBL_EPSILON,
1623331daffSriastradh 	1.5 - 2*LDBL_EPSILON,
1633331daffSriastradh 	1.5 - LDBL_EPSILON,
1643331daffSriastradh 	1.5,
1653331daffSriastradh 	1.5 + LDBL_EPSILON,
1663331daffSriastradh 	1.5 + 2*LDBL_EPSILON,
1673331daffSriastradh 	1.5 + 3*LDBL_EPSILON,
1683331daffSriastradh 	2,
1693331daffSriastradh 	1/FLT_EPSILON - 0.5,
1703331daffSriastradh 	1/FLT_EPSILON,
1713331daffSriastradh 	1/FLT_EPSILON + 0.5,
1723331daffSriastradh #ifdef __HAVE_LONG_DOUBLE
1733331daffSriastradh 	1/DBL_EPSILON - 0.5L,
1743331daffSriastradh 	1/DBL_EPSILON,
1753331daffSriastradh 	1/DBL_EPSILON + 0.5L,
1763331daffSriastradh #endif
1773331daffSriastradh 	0.5/LDBL_EPSILON - 0.5,
1783331daffSriastradh 	0.5/LDBL_EPSILON,
1793331daffSriastradh 	0.5/LDBL_EPSILON + 0.5,
1803331daffSriastradh 	1/LDBL_EPSILON,
1813331daffSriastradh 	LDBL_MAX,
1823331daffSriastradh 	INFINITY,
1833331daffSriastradh };
1843331daffSriastradh 
1853331daffSriastradh ATF_TC(hypotf_trivial);
ATF_TC_HEAD(hypotf_trivial,tc)1863331daffSriastradh ATF_TC_HEAD(hypotf_trivial, tc)
187e9eb083cSgson {
1883331daffSriastradh 	atf_tc_set_md_var(tc, "descr", "hypotf(x,0) and hypotf(0,x)");
1893331daffSriastradh }
ATF_TC_BODY(hypotf_trivial,tc)1903331daffSriastradh ATF_TC_BODY(hypotf_trivial, tc)
1913331daffSriastradh {
1923331daffSriastradh 	unsigned i;
1933331daffSriastradh 
1943331daffSriastradh 	for (i = 0; i < __arraycount(trivial_casesf); i++) {
1950ca3b42cSriastradh 		volatile float x = trivial_casesf[i];
1963331daffSriastradh 
1970ca3b42cSriastradh 		CHECK_EQ(i, hypotf, x, +0., x);
1980ca3b42cSriastradh 		CHECK_EQ(i, hypotf, x, -0., x);
1990ca3b42cSriastradh 		CHECK_EQ(i, hypotf, +0., x, x);
2000ca3b42cSriastradh 		CHECK_EQ(i, hypotf, -0., x, x);
2010ca3b42cSriastradh 		CHECK_EQ(i, hypotf, -x, +0., x);
2020ca3b42cSriastradh 		CHECK_EQ(i, hypotf, -x, -0., x);
2030ca3b42cSriastradh 		CHECK_EQ(i, hypotf, +0., -x, x);
2040ca3b42cSriastradh 		CHECK_EQ(i, hypotf, -0., -x, x);
205d2baffa5Sriastradh 
206d2baffa5Sriastradh 		if (isinf(INFINITY)) {
207d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, x, +INFINITY, INFINITY);
208d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, x, -INFINITY, INFINITY);
209d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, +INFINITY, x, INFINITY);
210d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, -INFINITY, x, INFINITY);
211d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, -x, +INFINITY, INFINITY);
212d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, -x, -INFINITY, INFINITY);
213d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, +INFINITY, -x, INFINITY);
214d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, -INFINITY, -x, INFINITY);
215d2baffa5Sriastradh 		}
216d2baffa5Sriastradh 
217d2baffa5Sriastradh #ifdef NAN
218d2baffa5Sriastradh 		if (isinf(x)) {
219d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, x, NAN, INFINITY);
220d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, NAN, x, INFINITY);
221d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, -x, NAN, INFINITY);
222d2baffa5Sriastradh 			CHECK_EQ(i, hypotf, NAN, -x, INFINITY);
223d2baffa5Sriastradh 		} else {
224d2baffa5Sriastradh 			CHECK_NAN(i, hypotf, x, NAN);
225d2baffa5Sriastradh 			CHECK_NAN(i, hypotf, NAN, x);
226d2baffa5Sriastradh 			CHECK_NAN(i, hypotf, -x, NAN);
227d2baffa5Sriastradh 			CHECK_NAN(i, hypotf, NAN, -x);
228d2baffa5Sriastradh 		}
229d2baffa5Sriastradh #endif
2303331daffSriastradh 	}
231e9eb083cSgson }
232e9eb083cSgson 
2333331daffSriastradh ATF_TC(hypot_trivial);
ATF_TC_HEAD(hypot_trivial,tc)2343331daffSriastradh ATF_TC_HEAD(hypot_trivial, tc)
235e9eb083cSgson {
2363331daffSriastradh 	atf_tc_set_md_var(tc, "descr", "hypot(x,0) and hypot(0,x)");
2373331daffSriastradh }
ATF_TC_BODY(hypot_trivial,tc)2383331daffSriastradh ATF_TC_BODY(hypot_trivial, tc)
2393331daffSriastradh {
2403331daffSriastradh 	unsigned i;
2413331daffSriastradh 
2423331daffSriastradh 	for (i = 0; i < __arraycount(trivial_casesf); i++) {
2430ca3b42cSriastradh 		volatile double x = trivial_casesf[i];
2443331daffSriastradh 
2450ca3b42cSriastradh 		CHECK_EQ(i, hypot, x, +0., x);
2460ca3b42cSriastradh 		CHECK_EQ(i, hypot, x, -0., x);
2470ca3b42cSriastradh 		CHECK_EQ(i, hypot, +0., x, x);
2480ca3b42cSriastradh 		CHECK_EQ(i, hypot, -0., x, x);
2490ca3b42cSriastradh 		CHECK_EQ(i, hypot, -x, +0., x);
2500ca3b42cSriastradh 		CHECK_EQ(i, hypot, -x, -0., x);
2510ca3b42cSriastradh 		CHECK_EQ(i, hypot, +0., -x, x);
2520ca3b42cSriastradh 		CHECK_EQ(i, hypot, -0., -x, x);
253d2baffa5Sriastradh 
254d2baffa5Sriastradh 		if (isinf(INFINITY)) {
255d2baffa5Sriastradh 			CHECK_EQ(i, hypot, x, +INFINITY, INFINITY);
256d2baffa5Sriastradh 			CHECK_EQ(i, hypot, x, -INFINITY, INFINITY);
257d2baffa5Sriastradh 			CHECK_EQ(i, hypot, +INFINITY, x, INFINITY);
258d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -INFINITY, x, INFINITY);
259d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -x, +INFINITY, INFINITY);
260d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -x, -INFINITY, INFINITY);
261d2baffa5Sriastradh 			CHECK_EQ(i, hypot, +INFINITY, -x, INFINITY);
262d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -INFINITY, -x, INFINITY);
263d2baffa5Sriastradh 		}
264d2baffa5Sriastradh 
265d2baffa5Sriastradh #ifdef NAN
266d2baffa5Sriastradh 		if (isinf(x)) {
267d2baffa5Sriastradh 			CHECK_EQ(i, hypot, x, NAN, INFINITY);
268d2baffa5Sriastradh 			CHECK_EQ(i, hypot, NAN, x, INFINITY);
269d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -x, NAN, INFINITY);
270d2baffa5Sriastradh 			CHECK_EQ(i, hypot, NAN, -x, INFINITY);
271d2baffa5Sriastradh 		} else {
272d2baffa5Sriastradh 			CHECK_NAN(i, hypot, x, NAN);
273d2baffa5Sriastradh 			CHECK_NAN(i, hypot, NAN, x);
274d2baffa5Sriastradh 			CHECK_NAN(i, hypot, -x, NAN);
275d2baffa5Sriastradh 			CHECK_NAN(i, hypot, NAN, -x);
276d2baffa5Sriastradh 		}
277d2baffa5Sriastradh #endif
278e9eb083cSgson 	}
279e9eb083cSgson 
2803331daffSriastradh 	for (i = 0; i < __arraycount(trivial_cases); i++) {
2810ca3b42cSriastradh 		volatile double x = trivial_cases[i];
2823331daffSriastradh 
2830ca3b42cSriastradh 		CHECK_EQ(i, hypot, x, +0., x);
2840ca3b42cSriastradh 		CHECK_EQ(i, hypot, x, -0., x);
2850ca3b42cSriastradh 		CHECK_EQ(i, hypot, +0., x, x);
2860ca3b42cSriastradh 		CHECK_EQ(i, hypot, -0., x, x);
2870ca3b42cSriastradh 		CHECK_EQ(i, hypot, -x, +0., x);
2880ca3b42cSriastradh 		CHECK_EQ(i, hypot, -x, -0., x);
2890ca3b42cSriastradh 		CHECK_EQ(i, hypot, +0., -x, x);
2900ca3b42cSriastradh 		CHECK_EQ(i, hypot, -0., -x, x);
291d2baffa5Sriastradh 
292d2baffa5Sriastradh 		if (isinf(INFINITY)) {
293d2baffa5Sriastradh 			CHECK_EQ(i, hypot, x, +INFINITY, INFINITY);
294d2baffa5Sriastradh 			CHECK_EQ(i, hypot, x, -INFINITY, INFINITY);
295d2baffa5Sriastradh 			CHECK_EQ(i, hypot, +INFINITY, x, INFINITY);
296d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -INFINITY, x, INFINITY);
297d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -x, +INFINITY, INFINITY);
298d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -x, -INFINITY, INFINITY);
299d2baffa5Sriastradh 			CHECK_EQ(i, hypot, +INFINITY, -x, INFINITY);
300d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -INFINITY, -x, INFINITY);
301d2baffa5Sriastradh 		}
302d2baffa5Sriastradh 
303d2baffa5Sriastradh #ifdef NAN
304d2baffa5Sriastradh 		if (isinf(x)) {
305d2baffa5Sriastradh 			CHECK_EQ(i, hypot, x, NAN, INFINITY);
306d2baffa5Sriastradh 			CHECK_EQ(i, hypot, NAN, x, INFINITY);
307d2baffa5Sriastradh 			CHECK_EQ(i, hypot, -x, NAN, INFINITY);
308d2baffa5Sriastradh 			CHECK_EQ(i, hypot, NAN, -x, INFINITY);
309d2baffa5Sriastradh 		} else {
310d2baffa5Sriastradh 			CHECK_NAN(i, hypot, x, NAN);
311d2baffa5Sriastradh 			CHECK_NAN(i, hypot, NAN, x);
312d2baffa5Sriastradh 			CHECK_NAN(i, hypot, -x, NAN);
313d2baffa5Sriastradh 			CHECK_NAN(i, hypot, NAN, -x);
314d2baffa5Sriastradh 		}
315d2baffa5Sriastradh #endif
3163331daffSriastradh 	}
317e9eb083cSgson }
318e9eb083cSgson 
3193331daffSriastradh ATF_TC(hypotl_trivial);
ATF_TC_HEAD(hypotl_trivial,tc)3203331daffSriastradh ATF_TC_HEAD(hypotl_trivial, tc)
321e9eb083cSgson {
3223331daffSriastradh 	atf_tc_set_md_var(tc, "descr", "hypotl(x,0) and hypotl(0,x)");
3233331daffSriastradh }
ATF_TC_BODY(hypotl_trivial,tc)3243331daffSriastradh ATF_TC_BODY(hypotl_trivial, tc)
3253331daffSriastradh {
3263331daffSriastradh 	unsigned i;
3273331daffSriastradh 
3283331daffSriastradh 	for (i = 0; i < __arraycount(trivial_casesf); i++) {
3290ca3b42cSriastradh 		volatile long double x = trivial_casesf[i];
3303331daffSriastradh 
3310ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, x, +0.L, x);
3320ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, x, -0.L, x);
3330ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, +0.L, x, x);
3340ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -0.L, x, x);
3350ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -x, +0.L, x);
3360ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -x, -0.L, x);
3370ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, +0.L, -x, x);
3380ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -0.L, -x, x);
339d2baffa5Sriastradh 
340d2baffa5Sriastradh 		if (isinf(INFINITY)) {
341d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
342d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
343d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
344d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
345d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
346d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
347d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
348d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
349d2baffa5Sriastradh 		}
350d2baffa5Sriastradh 
351d2baffa5Sriastradh #ifdef NAN
352d2baffa5Sriastradh 		if (isinf(x)) {
353d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
354d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
355d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
356d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
357d2baffa5Sriastradh 		} else {
358d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, x, NAN);
359d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, NAN, x);
360d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, -x, NAN);
361d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, NAN, -x);
362d2baffa5Sriastradh 		}
363d2baffa5Sriastradh #endif
3643331daffSriastradh 	}
3653331daffSriastradh 
3663331daffSriastradh 	for (i = 0; i < __arraycount(trivial_cases); i++) {
3670ca3b42cSriastradh 		volatile long double x = trivial_cases[i];
3683331daffSriastradh 
3690ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, x, +0.L, x);
3700ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, x, -0.L, x);
3710ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, +0.L, x, x);
3720ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -0.L, x, x);
3730ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -x, +0.L, x);
3740ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -x, -0.L, x);
3750ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, +0.L, -x, x);
3760ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -0.L, -x, x);
377d2baffa5Sriastradh 
378d2baffa5Sriastradh 		if (isinf(INFINITY)) {
379d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
380d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
381d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
382d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
383d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
384d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
385d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
386d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
387d2baffa5Sriastradh 		}
388d2baffa5Sriastradh 
389d2baffa5Sriastradh #ifdef NAN
390d2baffa5Sriastradh 		if (isinf(x)) {
391d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
392d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
393d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
394d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
395d2baffa5Sriastradh 		} else {
396d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, x, NAN);
397d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, NAN, x);
398d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, -x, NAN);
399d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, NAN, -x);
400d2baffa5Sriastradh 		}
401d2baffa5Sriastradh #endif
4023331daffSriastradh 	}
4033331daffSriastradh 
4043331daffSriastradh 	for (i = 0; i < __arraycount(trivial_casesl); i++) {
4050ca3b42cSriastradh 		volatile long double x = trivial_casesl[i];
4063331daffSriastradh 
4070ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, x, +0.L, x);
4080ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, x, -0.L, x);
4090ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, +0.L, x, x);
4100ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -0.L, x, x);
4110ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -x, +0.L, x);
4120ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -x, -0.L, x);
4130ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, +0.L, -x, x);
4140ca3b42cSriastradh 		CHECKL_EQ(i, hypotl, -0.L, -x, x);
415d2baffa5Sriastradh 
416d2baffa5Sriastradh 		if (isinf(INFINITY)) {
417d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
418d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
419d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
420d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
421d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
422d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
423d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
424d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
425d2baffa5Sriastradh 		}
426d2baffa5Sriastradh 
427d2baffa5Sriastradh #ifdef NAN
428d2baffa5Sriastradh 		if (isinf(x)) {
429d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
430d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
431d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
432d2baffa5Sriastradh 			CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
433d2baffa5Sriastradh 		} else {
434d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, x, NAN);
435d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, NAN, x);
436d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, -x, NAN);
437d2baffa5Sriastradh 			CHECKL_NAN(i, hypotl, NAN, -x);
438d2baffa5Sriastradh 		}
439d2baffa5Sriastradh #endif
4403331daffSriastradh 	}
4413331daffSriastradh }
4423331daffSriastradh 
443c3798314Sriastradh /*
444c3798314Sriastradh  * All primitive Pythagorean triples are generated from coprime
445c3798314Sriastradh  * integers m > n > 0 by Euclid's formula,
446c3798314Sriastradh  *
447c3798314Sriastradh  *	a = m^2 - n^2
448c3798314Sriastradh  *	b = 2 m n,
449c3798314Sriastradh  *	c = m^2 + n^2.
450c3798314Sriastradh  *
451c3798314Sriastradh  * We test cases with various different numbers and positions of bits,
452c3798314Sriastradh  * generated by this formula.
453c3798314Sriastradh  *
454c3798314Sriastradh  * If you're curious, you can recover m and n from a, b, and c by
455c3798314Sriastradh  *
456c3798314Sriastradh  *	m = sqrt((a + c)/2)
457c3798314Sriastradh  *	n = b/2m.
458c3798314Sriastradh  */
459c3798314Sriastradh 
4603331daffSriastradh __CTASSERT(FLT_MANT_DIG >= 24);
4613331daffSriastradh static const struct {
4623331daffSriastradh 	float a, b, c;
4633331daffSriastradh } exact_casesf[] = {
4643331daffSriastradh 	{ 3, 4, 5 },
4653331daffSriastradh 	{ 5, 12, 13 },
4663331daffSriastradh 	{ 9, 12, 15 },
4673331daffSriastradh 	{ 0x1001, 0x801000, 0x801001 },
4683331daffSriastradh 	{ 4248257, 1130976, 4396225 },
4693331daffSriastradh };
4703331daffSriastradh 
4713331daffSriastradh __CTASSERT(DBL_MANT_DIG >= 53);
4723331daffSriastradh static const struct {
4733331daffSriastradh 	double a, b, c;
4743331daffSriastradh } exact_cases[] = {
4753331daffSriastradh 	{ 3378249543467007, 4505248894795776, 5631148868747265 },
4763331daffSriastradh 	{ 0x7ffffff, 0x1ffffff8000000, 0x1ffffff8000001 },
4773331daffSriastradh #if DBL_MANT_DIG >= 56
4783331daffSriastradh 	{ 13514123525517439, 18018830919909120, 22523538851237761 },
4793331daffSriastradh 	{ 0x1fffffff, 0x1ffffffe0000000, 0x1ffffffe0000001 },
4803331daffSriastradh #endif
4813331daffSriastradh };
4823331daffSriastradh 
4833331daffSriastradh #if LDBL_MANT_DIG >= 64
4843331daffSriastradh static const struct {
4853331daffSriastradh 	long double a, b, c;
4863331daffSriastradh } exact_casesl[] = {
4873331daffSriastradh 	{ 3458976450080784639, 4611968592949214720, 5764960744407842561 },
488c3798314Sriastradh 	{ 0x200000000, 0x7ffffffffffffffe, 0x8000000000000002 },
4893331daffSriastradh #if LDBL_MANT_DIG >= 113
4903331daffSriastradh 	{ 973555668229277869436257492279295.L,
4913331daffSriastradh 	  1298074224305703705819019479072768.L,
4923331daffSriastradh 	  1622592780382129686316970078625793.L },
4933331daffSriastradh 	{ 0x1ffffffffffffff,
4943331daffSriastradh 	  0x1fffffffffffffe00000000000000p0L,
4953331daffSriastradh 	  0x1fffffffffffffe00000000000001p0L },
4963331daffSriastradh #endif
4973331daffSriastradh };
4983331daffSriastradh #endif
4993331daffSriastradh 
5003331daffSriastradh ATF_TC(hypotf_exact);
ATF_TC_HEAD(hypotf_exact,tc)5013331daffSriastradh ATF_TC_HEAD(hypotf_exact, tc)
5023331daffSriastradh {
5033331daffSriastradh 	atf_tc_set_md_var(tc, "descr", "hypotf on scaled Pythagorean triples");
5043331daffSriastradh }
ATF_TC_BODY(hypotf_exact,tc)5053331daffSriastradh ATF_TC_BODY(hypotf_exact, tc)
5063331daffSriastradh {
5073331daffSriastradh 	unsigned i;
5083331daffSriastradh 
5093331daffSriastradh 	for (i = 0; i < __arraycount(exact_casesf); i++) {
5103331daffSriastradh 		int s;
5113331daffSriastradh 
5123331daffSriastradh 		for (s = FLT_MIN_EXP;
5133331daffSriastradh 		     s < FLT_MAX_EXP - FLT_MANT_DIG;
5143331daffSriastradh 		     s += (FLT_MAX_EXP - FLT_MANT_DIG - FLT_MIN_EXP)/5) {
5153331daffSriastradh 			volatile double a = ldexpf(exact_casesf[i].a, s);
5163331daffSriastradh 			volatile double b = ldexpf(exact_casesf[i].b, s);
5173331daffSriastradh 			float c = ldexpf(exact_casesf[i].c, s);
5183331daffSriastradh 
5193331daffSriastradh 			CHECK_EQ(i, hypot, a, b, c);
5203331daffSriastradh 			CHECK_EQ(i, hypot, b, a, c);
5213331daffSriastradh 			CHECK_EQ(i, hypot, a, -b, c);
5223331daffSriastradh 			CHECK_EQ(i, hypot, b, -a, c);
5233331daffSriastradh 			CHECK_EQ(i, hypot, -a, b, c);
5243331daffSriastradh 			CHECK_EQ(i, hypot, -b, a, c);
5253331daffSriastradh 			CHECK_EQ(i, hypot, -a, -b, c);
5263331daffSriastradh 			CHECK_EQ(i, hypot, -b, -a, c);
5273331daffSriastradh 		}
5283331daffSriastradh 	}
5293331daffSriastradh }
5303331daffSriastradh 
5313331daffSriastradh ATF_TC(hypot_exact);
ATF_TC_HEAD(hypot_exact,tc)5323331daffSriastradh ATF_TC_HEAD(hypot_exact, tc)
5333331daffSriastradh {
5343331daffSriastradh 	atf_tc_set_md_var(tc, "descr", "hypot on scaled Pythagorean triples");
5353331daffSriastradh }
ATF_TC_BODY(hypot_exact,tc)5363331daffSriastradh ATF_TC_BODY(hypot_exact, tc)
5373331daffSriastradh {
5383331daffSriastradh 	unsigned i;
5393331daffSriastradh 
5403331daffSriastradh 	for (i = 0; i < __arraycount(exact_casesf); i++) {
5413331daffSriastradh 		int s;
5423331daffSriastradh 
5433331daffSriastradh 		for (s = DBL_MIN_EXP;
5443331daffSriastradh 		     s < DBL_MAX_EXP - DBL_MANT_DIG;
5453331daffSriastradh 		     s += (DBL_MAX_EXP - DBL_MANT_DIG - DBL_MIN_EXP)/5) {
5463331daffSriastradh 			volatile double a = ldexp(exact_casesf[i].a, s);
5473331daffSriastradh 			volatile double b = ldexp(exact_casesf[i].b, s);
5483331daffSriastradh 			double c = ldexp(exact_casesf[i].c, s);
5493331daffSriastradh 
5503331daffSriastradh 			CHECK_EQ(i, hypot, a, b, c);
5513331daffSriastradh 			CHECK_EQ(i, hypot, b, a, c);
5523331daffSriastradh 			CHECK_EQ(i, hypot, a, -b, c);
5533331daffSriastradh 			CHECK_EQ(i, hypot, b, -a, c);
5543331daffSriastradh 			CHECK_EQ(i, hypot, -a, b, c);
5553331daffSriastradh 			CHECK_EQ(i, hypot, -b, a, c);
5563331daffSriastradh 			CHECK_EQ(i, hypot, -a, -b, c);
5573331daffSriastradh 			CHECK_EQ(i, hypot, -b, -a, c);
5583331daffSriastradh 		}
5593331daffSriastradh 	}
5603331daffSriastradh 
5613331daffSriastradh 	for (i = 0; i < __arraycount(exact_cases); i++) {
5623331daffSriastradh 		int s;
5633331daffSriastradh 
5643331daffSriastradh 		for (s = DBL_MIN_EXP;
5653331daffSriastradh 		     s < DBL_MAX_EXP - DBL_MANT_DIG;
5663331daffSriastradh 		     s += (DBL_MAX_EXP - DBL_MANT_DIG - DBL_MIN_EXP)/5) {
5673331daffSriastradh 			volatile double a = ldexp(exact_cases[i].a, s);
5683331daffSriastradh 			volatile double b = ldexp(exact_cases[i].b, s);
5693331daffSriastradh 			double c = ldexp(exact_cases[i].c, s);
5703331daffSriastradh 
5713331daffSriastradh 			CHECK_EQ(i, hypot, a, b, c);
5723331daffSriastradh 			CHECK_EQ(i, hypot, b, a, c);
5733331daffSriastradh 			CHECK_EQ(i, hypot, a, -b, c);
5743331daffSriastradh 			CHECK_EQ(i, hypot, b, -a, c);
5753331daffSriastradh 			CHECK_EQ(i, hypot, -a, b, c);
5763331daffSriastradh 			CHECK_EQ(i, hypot, -b, a, c);
5773331daffSriastradh 			CHECK_EQ(i, hypot, -a, -b, c);
5783331daffSriastradh 			CHECK_EQ(i, hypot, -b, -a, c);
5793331daffSriastradh 		}
5803331daffSriastradh 	}
5813331daffSriastradh }
5823331daffSriastradh 
5833331daffSriastradh ATF_TC(hypotl_exact);
ATF_TC_HEAD(hypotl_exact,tc)5843331daffSriastradh ATF_TC_HEAD(hypotl_exact, tc)
5853331daffSriastradh {
5863331daffSriastradh 	atf_tc_set_md_var(tc, "descr", "hypotl on scaled Pythagorean triples");
5873331daffSriastradh }
ATF_TC_BODY(hypotl_exact,tc)5883331daffSriastradh ATF_TC_BODY(hypotl_exact, tc)
5893331daffSriastradh {
5903331daffSriastradh 	unsigned i;
5913331daffSriastradh 
5923331daffSriastradh 	for (i = 0; i < __arraycount(exact_casesf); i++) {
5933331daffSriastradh 		int s;
5943331daffSriastradh 
5953331daffSriastradh 		for (s = LDBL_MIN_EXP;
5963331daffSriastradh 		     s < LDBL_MAX_EXP - LDBL_MANT_DIG;
5973331daffSriastradh 		     s += (LDBL_MAX_EXP - LDBL_MANT_DIG - LDBL_MIN_EXP)/5) {
5983331daffSriastradh 			volatile long double a = ldexpl(exact_casesf[i].a, s);
5993331daffSriastradh 			volatile long double b = ldexpl(exact_casesf[i].b, s);
6003331daffSriastradh 			long double c = ldexpl(exact_casesf[i].c, s);
6013331daffSriastradh 
6023331daffSriastradh 			CHECKL_EQ(i, hypotl, a, b, c);
6033331daffSriastradh 			CHECKL_EQ(i, hypotl, b, a, c);
6043331daffSriastradh 			CHECKL_EQ(i, hypotl, a, -b, c);
6053331daffSriastradh 			CHECKL_EQ(i, hypotl, b, -a, c);
6063331daffSriastradh 			CHECKL_EQ(i, hypotl, -a, b, c);
6073331daffSriastradh 			CHECKL_EQ(i, hypotl, -b, a, c);
6083331daffSriastradh 			CHECKL_EQ(i, hypotl, -a, -b, c);
6093331daffSriastradh 			CHECKL_EQ(i, hypotl, -b, -a, c);
6103331daffSriastradh 		}
6113331daffSriastradh 	}
6123331daffSriastradh 
6133331daffSriastradh 	for (i = 0; i < __arraycount(exact_cases); i++) {
6143331daffSriastradh 		int s;
6153331daffSriastradh 
6163331daffSriastradh 		for (s = LDBL_MIN_EXP;
6173331daffSriastradh 		     s < LDBL_MAX_EXP - LDBL_MANT_DIG;
6183331daffSriastradh 		     s += (LDBL_MAX_EXP - LDBL_MANT_DIG - LDBL_MIN_EXP)/5) {
6193331daffSriastradh 			volatile long double a = ldexpl(exact_cases[i].a, s);
6203331daffSriastradh 			volatile long double b = ldexpl(exact_cases[i].b, s);
6213331daffSriastradh 			long double c = ldexpl(exact_cases[i].c, s);
6223331daffSriastradh 
6233331daffSriastradh 			CHECKL_EQ(i, hypotl, a, b, c);
6243331daffSriastradh 			CHECKL_EQ(i, hypotl, b, a, c);
6253331daffSriastradh 			CHECKL_EQ(i, hypotl, a, -b, c);
6263331daffSriastradh 			CHECKL_EQ(i, hypotl, b, -a, c);
6273331daffSriastradh 			CHECKL_EQ(i, hypotl, -a, b, c);
6283331daffSriastradh 			CHECKL_EQ(i, hypotl, -b, a, c);
6293331daffSriastradh 			CHECKL_EQ(i, hypotl, -a, -b, c);
6303331daffSriastradh 			CHECKL_EQ(i, hypotl, -b, -a, c);
6313331daffSriastradh 		}
6323331daffSriastradh 	}
6333331daffSriastradh 
6343331daffSriastradh #if LDBL_MANT_DIG >= 64
6353331daffSriastradh 	for (i = 0; i < __arraycount(exact_casesl); i++) {
6363331daffSriastradh 		int s;
6373331daffSriastradh 
6383331daffSriastradh 		for (s = LDBL_MIN_EXP;
6393331daffSriastradh 		     s < LDBL_MAX_EXP - LDBL_MANT_DIG;
6403331daffSriastradh 		     s += (LDBL_MAX_EXP - LDBL_MANT_DIG - LDBL_MIN_EXP)/5) {
6413331daffSriastradh 			volatile long double a = ldexpl(exact_casesl[i].a, s);
6423331daffSriastradh 			volatile long double b = ldexpl(exact_casesl[i].b, s);
6433331daffSriastradh 			long double c = ldexpl(exact_casesl[i].c, s);
6443331daffSriastradh 
6453331daffSriastradh 			CHECKL_EQ(i, hypotl, a, b, c);
6463331daffSriastradh 			CHECKL_EQ(i, hypotl, b, a, c);
6473331daffSriastradh 			CHECKL_EQ(i, hypotl, a, -b, c);
6483331daffSriastradh 			CHECKL_EQ(i, hypotl, b, -a, c);
6493331daffSriastradh 			CHECKL_EQ(i, hypotl, -a, b, c);
6503331daffSriastradh 			CHECKL_EQ(i, hypotl, -b, a, c);
6513331daffSriastradh 			CHECKL_EQ(i, hypotl, -a, -b, c);
6523331daffSriastradh 			CHECKL_EQ(i, hypotl, -b, -a, c);
6533331daffSriastradh 		}
6543331daffSriastradh 	}
6553331daffSriastradh #endif
656e9eb083cSgson }
657e9eb083cSgson 
658d2baffa5Sriastradh ATF_TC(hypot_nan);
ATF_TC_HEAD(hypot_nan,tc)659d2baffa5Sriastradh ATF_TC_HEAD(hypot_nan, tc)
660d2baffa5Sriastradh {
661d2baffa5Sriastradh 	atf_tc_set_md_var(tc, "descr", "hypot/hypotf/hypotl(NAN, NAN)");
662d2baffa5Sriastradh }
ATF_TC_BODY(hypot_nan,tc)663d2baffa5Sriastradh ATF_TC_BODY(hypot_nan, tc)
664d2baffa5Sriastradh {
665d2baffa5Sriastradh #ifdef NAN
666d2baffa5Sriastradh 	CHECK_NAN(0, hypot, NAN, NAN);
667d2baffa5Sriastradh 	CHECK_NAN(1, hypotf, NAN, NAN);
668d2baffa5Sriastradh 	CHECKL_NAN(2, hypotl, NAN, NAN);
669d2baffa5Sriastradh #else
670d2baffa5Sriastradh 	atf_tc_skip("no NaNs on this architecture");
671d2baffa5Sriastradh #endif
672d2baffa5Sriastradh }
673d2baffa5Sriastradh 
674e9eb083cSgson ATF_TC(pr50698);
ATF_TC_HEAD(pr50698,tc)675e9eb083cSgson ATF_TC_HEAD(pr50698, tc)
676e9eb083cSgson {
677bf613d33Sjruoho 	atf_tc_set_md_var(tc, "descr", "Check for the bug of PR lib/50698");
678e9eb083cSgson }
679e9eb083cSgson 
ATF_TC_BODY(pr50698,tc)680e9eb083cSgson ATF_TC_BODY(pr50698, tc)
681e9eb083cSgson {
682e9eb083cSgson 	volatile float a = 1e-18f;
683e9eb083cSgson 	float val = hypotf(a, a);
684e9eb083cSgson 	ATF_CHECK(!isinf(val));
685e9eb083cSgson 	ATF_CHECK(!isnan(val));
686e9eb083cSgson }
687e9eb083cSgson 
ATF_TP_ADD_TCS(tp)688e9eb083cSgson ATF_TP_ADD_TCS(tp)
689e9eb083cSgson {
690e9eb083cSgson 
6913331daffSriastradh 	ATF_TP_ADD_TC(tp, hypot_exact);
692*7e2cd5d0Srillig 	ATF_TP_ADD_TC(tp, hypot_nan);
6933331daffSriastradh 	ATF_TP_ADD_TC(tp, hypot_trivial);
6943331daffSriastradh 	ATF_TP_ADD_TC(tp, hypotf_exact);
6953331daffSriastradh 	ATF_TP_ADD_TC(tp, hypotf_trivial);
6963331daffSriastradh 	ATF_TP_ADD_TC(tp, hypotl_exact);
6973331daffSriastradh 	ATF_TP_ADD_TC(tp, hypotl_trivial);
698e9eb083cSgson 	ATF_TP_ADD_TC(tp, pr50698);
699e9eb083cSgson 
700e9eb083cSgson 	return atf_no_error();
701e9eb083cSgson }
702