1*a8a8e5f5Sriastradh /* $NetBSD: t_sqrt.c,v 1.8 2018/11/07 03:59:36 riastradh Exp $ */
29a2c9f32Sjruoho
39a2c9f32Sjruoho /*-
49a2c9f32Sjruoho * Copyright (c) 2011 The NetBSD Foundation, Inc.
59a2c9f32Sjruoho * All rights reserved.
69a2c9f32Sjruoho *
79a2c9f32Sjruoho * This code is derived from software contributed to The NetBSD Foundation
89a2c9f32Sjruoho * by Jukka Ruohonen.
99a2c9f32Sjruoho *
109a2c9f32Sjruoho * Redistribution and use in source and binary forms, with or without
119a2c9f32Sjruoho * modification, are permitted provided that the following conditions
129a2c9f32Sjruoho * are met:
139a2c9f32Sjruoho * 1. Redistributions of source code must retain the above copyright
149a2c9f32Sjruoho * notice, this list of conditions and the following disclaimer.
159a2c9f32Sjruoho * 2. Redistributions in binary form must reproduce the above copyright
169a2c9f32Sjruoho * notice, this list of conditions and the following disclaimer in the
179a2c9f32Sjruoho * documentation and/or other materials provided with the distribution.
189a2c9f32Sjruoho *
199a2c9f32Sjruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
209a2c9f32Sjruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
219a2c9f32Sjruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
229a2c9f32Sjruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
239a2c9f32Sjruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
249a2c9f32Sjruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
259a2c9f32Sjruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
269a2c9f32Sjruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
279a2c9f32Sjruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
289a2c9f32Sjruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
299a2c9f32Sjruoho * POSSIBILITY OF SUCH DAMAGE.
309a2c9f32Sjruoho */
319a2c9f32Sjruoho #include <sys/cdefs.h>
32*a8a8e5f5Sriastradh __RCSID("$NetBSD: t_sqrt.c,v 1.8 2018/11/07 03:59:36 riastradh Exp $");
339a2c9f32Sjruoho
349a2c9f32Sjruoho #include <atf-c.h>
359a2c9f32Sjruoho #include <math.h>
36f758bf64Smartin #include <float.h>
379a2c9f32Sjruoho #include <stdio.h>
389a2c9f32Sjruoho
399a2c9f32Sjruoho /*
409a2c9f32Sjruoho * sqrt(3)
419a2c9f32Sjruoho */
429a2c9f32Sjruoho ATF_TC(sqrt_nan);
ATF_TC_HEAD(sqrt_nan,tc)439a2c9f32Sjruoho ATF_TC_HEAD(sqrt_nan, tc)
449a2c9f32Sjruoho {
459a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrt(NaN) == NaN");
469a2c9f32Sjruoho }
479a2c9f32Sjruoho
ATF_TC_BODY(sqrt_nan,tc)489a2c9f32Sjruoho ATF_TC_BODY(sqrt_nan, tc)
499a2c9f32Sjruoho {
509a2c9f32Sjruoho const double x = 0.0L / 0.0L;
519a2c9f32Sjruoho
529a2c9f32Sjruoho ATF_CHECK(isnan(x) != 0);
539a2c9f32Sjruoho ATF_CHECK(isnan(sqrt(x)) != 0);
549a2c9f32Sjruoho }
559a2c9f32Sjruoho
569a2c9f32Sjruoho ATF_TC(sqrt_pow);
ATF_TC_HEAD(sqrt_pow,tc)579a2c9f32Sjruoho ATF_TC_HEAD(sqrt_pow, tc)
589a2c9f32Sjruoho {
599a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrt(3) vs. pow(3)");
609a2c9f32Sjruoho }
619a2c9f32Sjruoho
ATF_TC_BODY(sqrt_pow,tc)629a2c9f32Sjruoho ATF_TC_BODY(sqrt_pow, tc)
639a2c9f32Sjruoho {
649a2c9f32Sjruoho const double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.9999 };
65*a8a8e5f5Sriastradh const double eps = DBL_EPSILON;
669a2c9f32Sjruoho size_t i;
679a2c9f32Sjruoho
689a2c9f32Sjruoho for (i = 0; i < __arraycount(x); i++) {
69*a8a8e5f5Sriastradh double x_sqrt = sqrt(x[i]);
70*a8a8e5f5Sriastradh double x_pow12 = pow(x[i], 1.0 / 2.0);
71*a8a8e5f5Sriastradh bool ok;
729a2c9f32Sjruoho
73*a8a8e5f5Sriastradh if (x[i] == 0) {
74*a8a8e5f5Sriastradh ok = (x_sqrt == x_pow12);
75*a8a8e5f5Sriastradh } else {
76*a8a8e5f5Sriastradh ok = (fabs((x_sqrt - x_pow12)/x_sqrt) <= eps);
77*a8a8e5f5Sriastradh }
789a2c9f32Sjruoho
79*a8a8e5f5Sriastradh if (!ok) {
80*a8a8e5f5Sriastradh atf_tc_fail_nonfatal("sqrt(%.17g) = %.17g != "
81*a8a8e5f5Sriastradh "pow(%.17g, 1/2) = %.17g\n",
82*a8a8e5f5Sriastradh x[i], x_sqrt, x[i], x_pow12);
83*a8a8e5f5Sriastradh }
849a2c9f32Sjruoho }
859a2c9f32Sjruoho }
869a2c9f32Sjruoho
879a2c9f32Sjruoho ATF_TC(sqrt_inf_neg);
ATF_TC_HEAD(sqrt_inf_neg,tc)889a2c9f32Sjruoho ATF_TC_HEAD(sqrt_inf_neg, tc)
899a2c9f32Sjruoho {
909a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrt(-Inf) == NaN");
919a2c9f32Sjruoho }
929a2c9f32Sjruoho
ATF_TC_BODY(sqrt_inf_neg,tc)939a2c9f32Sjruoho ATF_TC_BODY(sqrt_inf_neg, tc)
949a2c9f32Sjruoho {
959a2c9f32Sjruoho const double x = -1.0L / 0.0L;
969a2c9f32Sjruoho double y = sqrt(x);
979a2c9f32Sjruoho
989a2c9f32Sjruoho ATF_CHECK(isnan(y) != 0);
999a2c9f32Sjruoho }
1009a2c9f32Sjruoho
1019a2c9f32Sjruoho ATF_TC(sqrt_inf_pos);
ATF_TC_HEAD(sqrt_inf_pos,tc)1029a2c9f32Sjruoho ATF_TC_HEAD(sqrt_inf_pos, tc)
1039a2c9f32Sjruoho {
1049a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrt(+Inf) == +Inf");
1059a2c9f32Sjruoho }
1069a2c9f32Sjruoho
ATF_TC_BODY(sqrt_inf_pos,tc)1079a2c9f32Sjruoho ATF_TC_BODY(sqrt_inf_pos, tc)
1089a2c9f32Sjruoho {
1099a2c9f32Sjruoho const double x = 1.0L / 0.0L;
1109a2c9f32Sjruoho double y = sqrt(x);
1119a2c9f32Sjruoho
1129a2c9f32Sjruoho ATF_CHECK(isinf(y) != 0);
1139a2c9f32Sjruoho ATF_CHECK(signbit(y) == 0);
1149a2c9f32Sjruoho }
1159a2c9f32Sjruoho
1169a2c9f32Sjruoho ATF_TC(sqrt_zero_neg);
ATF_TC_HEAD(sqrt_zero_neg,tc)1179a2c9f32Sjruoho ATF_TC_HEAD(sqrt_zero_neg, tc)
1189a2c9f32Sjruoho {
1199a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrt(-0.0) == -0.0");
1209a2c9f32Sjruoho }
1219a2c9f32Sjruoho
ATF_TC_BODY(sqrt_zero_neg,tc)1229a2c9f32Sjruoho ATF_TC_BODY(sqrt_zero_neg, tc)
1239a2c9f32Sjruoho {
1249a2c9f32Sjruoho const double x = -0.0L;
1259a2c9f32Sjruoho double y = sqrt(x);
1269a2c9f32Sjruoho
1279a2c9f32Sjruoho if (fabs(y) > 0.0 || signbit(y) == 0)
1289a2c9f32Sjruoho atf_tc_fail_nonfatal("sqrt(-0.0) != -0.0");
1299a2c9f32Sjruoho }
1309a2c9f32Sjruoho
1319a2c9f32Sjruoho ATF_TC(sqrt_zero_pos);
ATF_TC_HEAD(sqrt_zero_pos,tc)1329a2c9f32Sjruoho ATF_TC_HEAD(sqrt_zero_pos, tc)
1339a2c9f32Sjruoho {
1349a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrt(+0.0) == +0.0");
1359a2c9f32Sjruoho }
1369a2c9f32Sjruoho
ATF_TC_BODY(sqrt_zero_pos,tc)1379a2c9f32Sjruoho ATF_TC_BODY(sqrt_zero_pos, tc)
1389a2c9f32Sjruoho {
1399a2c9f32Sjruoho const double x = 0.0L;
1409a2c9f32Sjruoho double y = sqrt(x);
1419a2c9f32Sjruoho
1429a2c9f32Sjruoho if (fabs(y) > 0.0 || signbit(y) != 0)
1439a2c9f32Sjruoho atf_tc_fail_nonfatal("sqrt(+0.0) != +0.0");
1449a2c9f32Sjruoho }
1459a2c9f32Sjruoho
1469a2c9f32Sjruoho /*
1479a2c9f32Sjruoho * sqrtf(3)
1489a2c9f32Sjruoho */
1499a2c9f32Sjruoho ATF_TC(sqrtf_nan);
ATF_TC_HEAD(sqrtf_nan,tc)1509a2c9f32Sjruoho ATF_TC_HEAD(sqrtf_nan, tc)
1519a2c9f32Sjruoho {
1529a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrtf(NaN) == NaN");
1539a2c9f32Sjruoho }
1549a2c9f32Sjruoho
ATF_TC_BODY(sqrtf_nan,tc)1559a2c9f32Sjruoho ATF_TC_BODY(sqrtf_nan, tc)
1569a2c9f32Sjruoho {
1579a2c9f32Sjruoho const float x = 0.0L / 0.0L;
1589a2c9f32Sjruoho
1599a2c9f32Sjruoho ATF_CHECK(isnan(x) != 0);
1609a2c9f32Sjruoho ATF_CHECK(isnan(sqrtf(x)) != 0);
1619a2c9f32Sjruoho }
1629a2c9f32Sjruoho
1639a2c9f32Sjruoho ATF_TC(sqrtf_powf);
ATF_TC_HEAD(sqrtf_powf,tc)1649a2c9f32Sjruoho ATF_TC_HEAD(sqrtf_powf, tc)
1659a2c9f32Sjruoho {
1669a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrtf(3) vs. powf(3)");
1679a2c9f32Sjruoho }
1689a2c9f32Sjruoho
ATF_TC_BODY(sqrtf_powf,tc)1699a2c9f32Sjruoho ATF_TC_BODY(sqrtf_powf, tc)
1709a2c9f32Sjruoho {
1719a2c9f32Sjruoho const float x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.9999 };
172*a8a8e5f5Sriastradh const float eps = FLT_EPSILON;
1739a2c9f32Sjruoho size_t i;
1749a2c9f32Sjruoho
1759a2c9f32Sjruoho for (i = 0; i < __arraycount(x); i++) {
176*a8a8e5f5Sriastradh float x_sqrt = sqrtf(x[i]);
177*a8a8e5f5Sriastradh float x_pow12 = powf(x[i], 1.0 / 2.0);
178*a8a8e5f5Sriastradh bool ok;
1799a2c9f32Sjruoho
180*a8a8e5f5Sriastradh if (x[i] == 0) {
181*a8a8e5f5Sriastradh ok = (x_sqrt == x_pow12);
182*a8a8e5f5Sriastradh } else {
183*a8a8e5f5Sriastradh ok = (fabsf((x_sqrt - x_pow12)/x_sqrt) <= eps);
184*a8a8e5f5Sriastradh }
1859a2c9f32Sjruoho
186*a8a8e5f5Sriastradh if (!ok) {
187*a8a8e5f5Sriastradh atf_tc_fail_nonfatal("sqrtf(%.8g) = %.8g != "
188*a8a8e5f5Sriastradh "powf(%.8g, 1/2) = %.8g\n",
189*a8a8e5f5Sriastradh (double)x[i], (double)x_sqrt,
190*a8a8e5f5Sriastradh (double)x[i], (double)x_pow12);
191*a8a8e5f5Sriastradh }
1929a2c9f32Sjruoho }
1939a2c9f32Sjruoho }
1949a2c9f32Sjruoho
1959a2c9f32Sjruoho ATF_TC(sqrtf_inf_neg);
ATF_TC_HEAD(sqrtf_inf_neg,tc)1969a2c9f32Sjruoho ATF_TC_HEAD(sqrtf_inf_neg, tc)
1979a2c9f32Sjruoho {
1989a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrtf(-Inf) == NaN");
1999a2c9f32Sjruoho }
2009a2c9f32Sjruoho
ATF_TC_BODY(sqrtf_inf_neg,tc)2019a2c9f32Sjruoho ATF_TC_BODY(sqrtf_inf_neg, tc)
2029a2c9f32Sjruoho {
2039a2c9f32Sjruoho const float x = -1.0L / 0.0L;
2049a2c9f32Sjruoho float y = sqrtf(x);
2059a2c9f32Sjruoho
2069a2c9f32Sjruoho ATF_CHECK(isnan(y) != 0);
2079a2c9f32Sjruoho }
2089a2c9f32Sjruoho
2099a2c9f32Sjruoho ATF_TC(sqrtf_inf_pos);
ATF_TC_HEAD(sqrtf_inf_pos,tc)2109a2c9f32Sjruoho ATF_TC_HEAD(sqrtf_inf_pos, tc)
2119a2c9f32Sjruoho {
2129a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrtf(+Inf) == +Inf");
2139a2c9f32Sjruoho }
2149a2c9f32Sjruoho
ATF_TC_BODY(sqrtf_inf_pos,tc)2159a2c9f32Sjruoho ATF_TC_BODY(sqrtf_inf_pos, tc)
2169a2c9f32Sjruoho {
2179a2c9f32Sjruoho const float x = 1.0L / 0.0L;
2189a2c9f32Sjruoho float y = sqrtf(x);
2199a2c9f32Sjruoho
2209a2c9f32Sjruoho ATF_CHECK(isinf(y) != 0);
2219a2c9f32Sjruoho ATF_CHECK(signbit(y) == 0);
2229a2c9f32Sjruoho }
2239a2c9f32Sjruoho
2249a2c9f32Sjruoho ATF_TC(sqrtf_zero_neg);
ATF_TC_HEAD(sqrtf_zero_neg,tc)2259a2c9f32Sjruoho ATF_TC_HEAD(sqrtf_zero_neg, tc)
2269a2c9f32Sjruoho {
2279a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrtf(-0.0) == -0.0");
2289a2c9f32Sjruoho }
2299a2c9f32Sjruoho
ATF_TC_BODY(sqrtf_zero_neg,tc)2309a2c9f32Sjruoho ATF_TC_BODY(sqrtf_zero_neg, tc)
2319a2c9f32Sjruoho {
2329a2c9f32Sjruoho const float x = -0.0L;
2339a2c9f32Sjruoho float y = sqrtf(x);
2349a2c9f32Sjruoho
2359a2c9f32Sjruoho if (fabsf(y) > 0.0 || signbit(y) == 0)
2369a2c9f32Sjruoho atf_tc_fail_nonfatal("sqrtf(-0.0) != -0.0");
2379a2c9f32Sjruoho }
2389a2c9f32Sjruoho
2399a2c9f32Sjruoho ATF_TC(sqrtf_zero_pos);
ATF_TC_HEAD(sqrtf_zero_pos,tc)2409a2c9f32Sjruoho ATF_TC_HEAD(sqrtf_zero_pos, tc)
2419a2c9f32Sjruoho {
2429a2c9f32Sjruoho atf_tc_set_md_var(tc, "descr", "Test sqrtf(+0.0) == +0.0");
2439a2c9f32Sjruoho }
2449a2c9f32Sjruoho
ATF_TC_BODY(sqrtf_zero_pos,tc)2459a2c9f32Sjruoho ATF_TC_BODY(sqrtf_zero_pos, tc)
2469a2c9f32Sjruoho {
2479a2c9f32Sjruoho const float x = 0.0L;
2489a2c9f32Sjruoho float y = sqrtf(x);
2499a2c9f32Sjruoho
2509a2c9f32Sjruoho if (fabsf(y) > 0.0 || signbit(y) != 0)
2519a2c9f32Sjruoho atf_tc_fail_nonfatal("sqrtf(+0.0) != +0.0");
2529a2c9f32Sjruoho }
2539a2c9f32Sjruoho
254f63f9867Sjoerg /*
255f63f9867Sjoerg * sqrtl(3)
256f63f9867Sjoerg */
257f63f9867Sjoerg ATF_TC(sqrtl_nan);
ATF_TC_HEAD(sqrtl_nan,tc)258f63f9867Sjoerg ATF_TC_HEAD(sqrtl_nan, tc)
259f63f9867Sjoerg {
260f63f9867Sjoerg atf_tc_set_md_var(tc, "descr", "Test sqrtl(NaN) == NaN");
261f63f9867Sjoerg }
262f63f9867Sjoerg
ATF_TC_BODY(sqrtl_nan,tc)263f63f9867Sjoerg ATF_TC_BODY(sqrtl_nan, tc)
264f63f9867Sjoerg {
265f63f9867Sjoerg const long double x = 0.0L / 0.0L;
266f63f9867Sjoerg
267f63f9867Sjoerg ATF_CHECK(isnan(x) != 0);
268f63f9867Sjoerg ATF_CHECK(isnan(sqrtl(x)) != 0);
269f63f9867Sjoerg }
270f63f9867Sjoerg
271f63f9867Sjoerg ATF_TC(sqrtl_powl);
ATF_TC_HEAD(sqrtl_powl,tc)272f63f9867Sjoerg ATF_TC_HEAD(sqrtl_powl, tc)
273f63f9867Sjoerg {
274f63f9867Sjoerg atf_tc_set_md_var(tc, "descr", "Test sqrtl(3) vs. powl(3)");
275f63f9867Sjoerg }
276f63f9867Sjoerg
ATF_TC_BODY(sqrtl_powl,tc)277f63f9867Sjoerg ATF_TC_BODY(sqrtl_powl, tc)
278f63f9867Sjoerg {
279f63f9867Sjoerg const long double x[] = { 0.0, 0.005, 1.0, 99.0, 123.123, 9999.9999 };
280*a8a8e5f5Sriastradh const long double eps = DBL_EPSILON; /* XXX powl == pow for now */
281f63f9867Sjoerg size_t i;
282f63f9867Sjoerg
283f63f9867Sjoerg for (i = 0; i < __arraycount(x); i++) {
284*a8a8e5f5Sriastradh long double x_sqrt = sqrtl(x[i]);
285*a8a8e5f5Sriastradh long double x_pow12 = powl(x[i], 1.0 / 2.0);
286*a8a8e5f5Sriastradh bool ok;
287f63f9867Sjoerg
288*a8a8e5f5Sriastradh if (x[i] == 0) {
289*a8a8e5f5Sriastradh ok = (x_sqrt == x_pow12);
290*a8a8e5f5Sriastradh } else {
291*a8a8e5f5Sriastradh ok = (fabsl((x_sqrt - x_pow12)/x_sqrt) <= eps);
292*a8a8e5f5Sriastradh }
293f63f9867Sjoerg
294*a8a8e5f5Sriastradh if (!ok) {
295*a8a8e5f5Sriastradh atf_tc_fail_nonfatal("sqrtl(%.35Lg) = %.35Lg != "
296*a8a8e5f5Sriastradh "powl(%.35Lg, 1/2) = %.35Lg\n",
297*a8a8e5f5Sriastradh x[i], x_sqrt, x[i], x_pow12);
298*a8a8e5f5Sriastradh }
299f63f9867Sjoerg }
300f63f9867Sjoerg }
301f63f9867Sjoerg
302f63f9867Sjoerg ATF_TC(sqrtl_inf_neg);
ATF_TC_HEAD(sqrtl_inf_neg,tc)303f63f9867Sjoerg ATF_TC_HEAD(sqrtl_inf_neg, tc)
304f63f9867Sjoerg {
305f63f9867Sjoerg atf_tc_set_md_var(tc, "descr", "Test sqrtl(-Inf) == NaN");
306f63f9867Sjoerg }
307f63f9867Sjoerg
ATF_TC_BODY(sqrtl_inf_neg,tc)308f63f9867Sjoerg ATF_TC_BODY(sqrtl_inf_neg, tc)
309f63f9867Sjoerg {
310f63f9867Sjoerg const long double x = -1.0L / 0.0L;
311f63f9867Sjoerg long double y = sqrtl(x);
312f63f9867Sjoerg
313f63f9867Sjoerg ATF_CHECK(isnan(y) != 0);
314f63f9867Sjoerg }
315f63f9867Sjoerg
316f63f9867Sjoerg ATF_TC(sqrtl_inf_pos);
ATF_TC_HEAD(sqrtl_inf_pos,tc)317f63f9867Sjoerg ATF_TC_HEAD(sqrtl_inf_pos, tc)
318f63f9867Sjoerg {
319f63f9867Sjoerg atf_tc_set_md_var(tc, "descr", "Test sqrtl(+Inf) == +Inf");
320f63f9867Sjoerg }
321f63f9867Sjoerg
ATF_TC_BODY(sqrtl_inf_pos,tc)322f63f9867Sjoerg ATF_TC_BODY(sqrtl_inf_pos, tc)
323f63f9867Sjoerg {
324f63f9867Sjoerg const long double x = 1.0L / 0.0L;
325f63f9867Sjoerg long double y = sqrtl(x);
326f63f9867Sjoerg
327f63f9867Sjoerg ATF_CHECK(isinf(y) != 0);
328f63f9867Sjoerg ATF_CHECK(signbit(y) == 0);
329f63f9867Sjoerg }
330f63f9867Sjoerg
331f63f9867Sjoerg ATF_TC(sqrtl_zero_neg);
ATF_TC_HEAD(sqrtl_zero_neg,tc)332f63f9867Sjoerg ATF_TC_HEAD(sqrtl_zero_neg, tc)
333f63f9867Sjoerg {
334f63f9867Sjoerg atf_tc_set_md_var(tc, "descr", "Test sqrtl(-0.0) == -0.0");
335f63f9867Sjoerg }
336f63f9867Sjoerg
ATF_TC_BODY(sqrtl_zero_neg,tc)337f63f9867Sjoerg ATF_TC_BODY(sqrtl_zero_neg, tc)
338f63f9867Sjoerg {
339f63f9867Sjoerg const long double x = -0.0L;
340f63f9867Sjoerg long double y = sqrtl(x);
341f63f9867Sjoerg
342f63f9867Sjoerg if (fabsl(y) > 0.0 || signbit(y) == 0)
343f63f9867Sjoerg atf_tc_fail_nonfatal("sqrtl(-0.0) != -0.0");
344f63f9867Sjoerg }
345f63f9867Sjoerg
346f63f9867Sjoerg ATF_TC(sqrtl_zero_pos);
ATF_TC_HEAD(sqrtl_zero_pos,tc)347f63f9867Sjoerg ATF_TC_HEAD(sqrtl_zero_pos, tc)
348f63f9867Sjoerg {
349f63f9867Sjoerg atf_tc_set_md_var(tc, "descr", "Test sqrtl(+0.0) == +0.0");
350f63f9867Sjoerg }
351f63f9867Sjoerg
ATF_TC_BODY(sqrtl_zero_pos,tc)352f63f9867Sjoerg ATF_TC_BODY(sqrtl_zero_pos, tc)
353f63f9867Sjoerg {
354f63f9867Sjoerg const long double x = 0.0L;
355f63f9867Sjoerg long double y = sqrtl(x);
356f63f9867Sjoerg
357f63f9867Sjoerg if (fabsl(y) > 0.0 || signbit(y) != 0)
358f63f9867Sjoerg atf_tc_fail_nonfatal("sqrtl(+0.0) != +0.0");
359f63f9867Sjoerg }
360f63f9867Sjoerg
ATF_TP_ADD_TCS(tp)3619a2c9f32Sjruoho ATF_TP_ADD_TCS(tp)
3629a2c9f32Sjruoho {
3639a2c9f32Sjruoho
3649a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrt_nan);
3659a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrt_pow);
3669a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrt_inf_neg);
3679a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrt_inf_pos);
3689a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrt_zero_neg);
3699a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrt_zero_pos);
3709a2c9f32Sjruoho
3719a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrtf_nan);
3729a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrtf_powf);
3739a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrtf_inf_neg);
3749a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrtf_inf_pos);
3759a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrtf_zero_neg);
3769a2c9f32Sjruoho ATF_TP_ADD_TC(tp, sqrtf_zero_pos);
3779a2c9f32Sjruoho
378f63f9867Sjoerg ATF_TP_ADD_TC(tp, sqrtl_nan);
379f63f9867Sjoerg ATF_TP_ADD_TC(tp, sqrtl_powl);
380f63f9867Sjoerg ATF_TP_ADD_TC(tp, sqrtl_inf_neg);
381f63f9867Sjoerg ATF_TP_ADD_TC(tp, sqrtl_inf_pos);
382f63f9867Sjoerg ATF_TP_ADD_TC(tp, sqrtl_zero_neg);
383f63f9867Sjoerg ATF_TP_ADD_TC(tp, sqrtl_zero_pos);
384f63f9867Sjoerg
3859a2c9f32Sjruoho return atf_no_error();
3869a2c9f32Sjruoho }
387