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