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)
 {

Reply via email to