Module Name: src
Committed By: riastradh
Date: Sat May 11 20:51:41 UTC 2024
Modified Files:
src/tests/lib/libm: t_hypot.c
Log Message:
tests/lib/libm/t_hypot: Check inf/nan cases too.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/tests/lib/libm/t_hypot.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/lib/libm/t_hypot.c
diff -u src/tests/lib/libm/t_hypot.c:1.5 src/tests/lib/libm/t_hypot.c:1.6
--- src/tests/lib/libm/t_hypot.c:1.5 Sat May 11 20:09:47 2024
+++ src/tests/lib/libm/t_hypot.c Sat May 11 20:51:41 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: t_hypot.c,v 1.5 2024/05/11 20:09:47 riastradh Exp $ */
+/* $NetBSD: t_hypot.c,v 1.6 2024/05/11 20:51:41 riastradh Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -38,7 +38,18 @@
#define CHECKL_EQ(i, hypot, a, b, c) \
ATF_CHECK_MSG(hypot(a, b) == (c), \
"[%u] %s(%La, %La)=%La, expected %La", \
- (i), #hypot, (a), (b), hypot(a, b), (c))
+ (i), #hypot, (long double)(a), (long double)(b), hypot(a, b), \
+ (long double)(c))
+
+#define CHECK_NAN(i, hypot, a, b) \
+ ATF_CHECK_MSG(isnan(hypot(a, b)), \
+ "[%u] %s(%a, %a)=%a, expected NaN", \
+ (i), #hypot, (a), (b), hypot(a, b))
+
+#define CHECKL_NAN(i, hypot, a, b) \
+ ATF_CHECK_MSG(isnan(hypot(a, b)), \
+ "[%u] %s(%La, %La)=%La, expected NaN", \
+ (i), #hypot, (long double)(a), (long double)(b), hypot(a, b))
static const float trivial_casesf[] = {
0,
@@ -191,6 +202,31 @@ ATF_TC_BODY(hypotf_trivial, tc)
CHECK_EQ(i, hypotf, -x, -0., x);
CHECK_EQ(i, hypotf, +0., -x, x);
CHECK_EQ(i, hypotf, -0., -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECK_EQ(i, hypotf, x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypotf, x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypotf, +INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypotf, -INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypotf, -x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypotf, -x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypotf, +INFINITY, -x, INFINITY);
+ CHECK_EQ(i, hypotf, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECK_EQ(i, hypotf, x, NAN, INFINITY);
+ CHECK_EQ(i, hypotf, NAN, x, INFINITY);
+ CHECK_EQ(i, hypotf, -x, NAN, INFINITY);
+ CHECK_EQ(i, hypotf, NAN, -x, INFINITY);
+ } else {
+ CHECK_NAN(i, hypotf, x, NAN);
+ CHECK_NAN(i, hypotf, NAN, x);
+ CHECK_NAN(i, hypotf, -x, NAN);
+ CHECK_NAN(i, hypotf, NAN, -x);
+ }
+#endif
}
}
@@ -214,6 +250,31 @@ ATF_TC_BODY(hypot_trivial, tc)
CHECK_EQ(i, hypot, -x, -0., x);
CHECK_EQ(i, hypot, +0., -x, x);
CHECK_EQ(i, hypot, -0., -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECK_EQ(i, hypot, x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, +INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypot, -INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypot, -x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, -x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, +INFINITY, -x, INFINITY);
+ CHECK_EQ(i, hypot, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECK_EQ(i, hypot, x, NAN, INFINITY);
+ CHECK_EQ(i, hypot, NAN, x, INFINITY);
+ CHECK_EQ(i, hypot, -x, NAN, INFINITY);
+ CHECK_EQ(i, hypot, NAN, -x, INFINITY);
+ } else {
+ CHECK_NAN(i, hypot, x, NAN);
+ CHECK_NAN(i, hypot, NAN, x);
+ CHECK_NAN(i, hypot, -x, NAN);
+ CHECK_NAN(i, hypot, NAN, -x);
+ }
+#endif
}
for (i = 0; i < __arraycount(trivial_cases); i++) {
@@ -227,6 +288,31 @@ ATF_TC_BODY(hypot_trivial, tc)
CHECK_EQ(i, hypot, -x, -0., x);
CHECK_EQ(i, hypot, +0., -x, x);
CHECK_EQ(i, hypot, -0., -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECK_EQ(i, hypot, x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, +INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypot, -INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypot, -x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, -x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, +INFINITY, -x, INFINITY);
+ CHECK_EQ(i, hypot, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECK_EQ(i, hypot, x, NAN, INFINITY);
+ CHECK_EQ(i, hypot, NAN, x, INFINITY);
+ CHECK_EQ(i, hypot, -x, NAN, INFINITY);
+ CHECK_EQ(i, hypot, NAN, -x, INFINITY);
+ } else {
+ CHECK_NAN(i, hypot, x, NAN);
+ CHECK_NAN(i, hypot, NAN, x);
+ CHECK_NAN(i, hypot, -x, NAN);
+ CHECK_NAN(i, hypot, NAN, -x);
+ }
+#endif
}
}
@@ -250,6 +336,31 @@ ATF_TC_BODY(hypotl_trivial, tc)
CHECKL_EQ(i, hypotl, -x, -0.L, x);
CHECKL_EQ(i, hypotl, +0.L, -x, x);
CHECKL_EQ(i, hypotl, -0.L, -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
+ } else {
+ CHECKL_NAN(i, hypotl, x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, x);
+ CHECKL_NAN(i, hypotl, -x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, -x);
+ }
+#endif
}
for (i = 0; i < __arraycount(trivial_cases); i++) {
@@ -263,6 +374,31 @@ ATF_TC_BODY(hypotl_trivial, tc)
CHECKL_EQ(i, hypotl, -x, -0.L, x);
CHECKL_EQ(i, hypotl, +0.L, -x, x);
CHECKL_EQ(i, hypotl, -0.L, -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
+ } else {
+ CHECKL_NAN(i, hypotl, x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, x);
+ CHECKL_NAN(i, hypotl, -x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, -x);
+ }
+#endif
}
for (i = 0; i < __arraycount(trivial_casesl); i++) {
@@ -276,6 +412,31 @@ ATF_TC_BODY(hypotl_trivial, tc)
CHECKL_EQ(i, hypotl, -x, -0.L, x);
CHECKL_EQ(i, hypotl, +0.L, -x, x);
CHECKL_EQ(i, hypotl, -0.L, -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
+ } else {
+ CHECKL_NAN(i, hypotl, x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, x);
+ CHECKL_NAN(i, hypotl, -x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, -x);
+ }
+#endif
}
}
@@ -477,6 +638,22 @@ ATF_TC_BODY(hypotl_exact, tc)
#endif
}
+ATF_TC(hypot_nan);
+ATF_TC_HEAD(hypot_nan, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "hypot/hypotf/hypotl(NAN, NAN)");
+}
+ATF_TC_BODY(hypot_nan, tc)
+{
+#ifdef NAN
+ CHECK_NAN(0, hypot, NAN, NAN);
+ CHECK_NAN(1, hypotf, NAN, NAN);
+ CHECKL_NAN(2, hypotl, NAN, NAN);
+#else
+ atf_tc_skip("no NaNs on this architecture");
+#endif
+}
+
ATF_TC(pr50698);
ATF_TC_HEAD(pr50698, tc)
{