Module Name: src
Committed By: riastradh
Date: Thu May 9 12:18:28 UTC 2024
Modified Files:
src/tests/lib/libm: t_fe_round.c
Log Message:
tests/lib/libm/t_fe_round.c: Tidy.
nextafter/nexttoward tests didn't make much sense, and are now
supplanted by t_next.
PR misc/58054
To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/tests/lib/libm/t_fe_round.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_fe_round.c
diff -u src/tests/lib/libm/t_fe_round.c:1.18 src/tests/lib/libm/t_fe_round.c:1.19
--- src/tests/lib/libm/t_fe_round.c:1.18 Wed May 8 22:59:07 2024
+++ src/tests/lib/libm/t_fe_round.c Thu May 9 12:18:28 2024
@@ -1,3 +1,5 @@
+/* $NetBSD: t_fe_round.c,v 1.19 2024/05/09 12:18:28 riastradh Exp $ */
+
/*
* Written by Maya Rashish <[email protected]>
* Public domain.
@@ -5,20 +7,22 @@
* Testing IEEE-754 rounding modes (and lrint)
*/
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_fe_round.c,v 1.19 2024/05/09 12:18:28 riastradh Exp $");
+
#include <atf-c.h>
#include <fenv.h>
-#ifdef __HAVE_FENV
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
+#ifdef __HAVE_FENV
+
/*#pragma STDC FENV_ACCESS ON gcc?? */
#define INT 9223L
-#define EPSILON 0.001
-
static const char *
rmname(int rm)
{
@@ -36,6 +40,13 @@ rmname(int rm)
}
}
+/*
+ * Examples are chosen to fit within the smallest single-precision
+ * format any NetBSD port uses, so that we can write the examples once
+ * in type double, and convert to single without raising inexact-result
+ * exceptions when we're trying to test whether the integer-rounding
+ * functions raise them.
+ */
static const struct {
int round_mode;
double input;
@@ -44,15 +55,13 @@ static const struct {
{ FE_DOWNWARD, 3.75, 3},
{ FE_DOWNWARD, -3.75, -4},
{ FE_DOWNWARD, +0., 0},
+ { FE_DOWNWARD, -0., 0},
{ FE_DOWNWARD, -INT-0.0625, -INT-1},
{ FE_DOWNWARD, +INT-0.0625, INT-1},
{ FE_DOWNWARD, -INT+0.0625, -INT},
{ FE_DOWNWARD, +INT+0.0625, INT},
-#if 0 /* cpu bugs? */
- { FE_DOWNWARD, -0., -1},
- { FE_UPWARD, +0., 1},
-#endif
+ { FE_UPWARD, +0., 0},
{ FE_UPWARD, -0., 0},
{ FE_UPWARD, -123.75, -123},
{ FE_UPWARD, 123.75, 124},
@@ -432,68 +441,7 @@ ATF_TC_BODY(fe_nearbyintl_rintl, tc)
}
}
-#endif
-
-static const struct {
- double input;
- double toward;
- double expected;
-} values2[] = {
- { 10.0, 11.0, 10.0 },
- { -5.0, -6.0, -5.0 },
-};
-
-ATF_TC(fe_nextafter);
-ATF_TC_HEAD(fe_nextafter, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Checking IEEE 754 rounding using nextafter()");
-}
-
-ATF_TC_BODY(fe_nextafter, tc)
-{
- double received;
- int res;
-
- for (unsigned int i = 0; i < __arraycount(values2); i++) {
- received = nextafter(values2[i].input, values2[i].toward);
- if (values2[i].input < values2[i].toward) {
- res = (received > values2[i].input);
- } else {
- res = (received < values2[i].input);
- }
- ATF_CHECK_MSG(
- res && (fabs(received - values2[i].expected) < EPSILON),
- "nextafter() rounding wrong, difference too large\n"
- "input: %f (index %d): got %f, expected %f, res %d\n",
- values2[i].input, i, received, values2[i].expected, res);
- }
-}
-
-ATF_TC(fe_nexttoward);
-ATF_TC_HEAD(fe_nexttoward, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Checking IEEE 754 rounding using nexttoward()");
-}
-
-ATF_TC_BODY(fe_nexttoward, tc)
-{
- double received;
- int res;
-
- for (unsigned int i = 0; i < __arraycount(values2); i++) {
- received = nexttoward(values2[i].input, values2[i].toward);
- if (values2[i].input < values2[i].toward) {
- res = (received > values2[i].input);
- } else {
- res = (received < values2[i].input);
- }
- ATF_CHECK_MSG(
- res && (fabs(received - values2[i].expected) < EPSILON),
- "nexttoward() rounding wrong, difference too large\n"
- "input: %f (index %d): got %f, expected %f, res %d\n",
- values2[i].input, i, received, values2[i].expected, res);
- }
-}
+#endif /* __HAVE_LONG_DOUBLE */
ATF_TP_ADD_TCS(tp)
{
@@ -503,71 +451,19 @@ ATF_TP_ADD_TCS(tp)
#ifdef __HAVE_LONG_DOUBLE
ATF_TP_ADD_TC(tp, fe_nearbyintl_rintl);
#endif
- ATF_TP_ADD_TC(tp, fe_nextafter);
- ATF_TP_ADD_TC(tp, fe_nexttoward);
return atf_no_error();
}
-#else
-ATF_TC(t_nofe_round);
-ATF_TC_HEAD(t_nofe_round, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "dummy test case - no fenv.h support");
-}
-
-ATF_TC_BODY(t_nofe_round, tc)
-{
- atf_tc_skip("no fenv.h support on this architecture");
-}
-
-ATF_TC(t_nofe_nearbyint);
-
-ATF_TC_HEAD(t_nofe_nearbyint, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "dummy test case - no fenv.h support");
-}
-
-ATF_TC_BODY(t_nofe_nearbyint, tc)
-{
- atf_tc_skip("no fenv.h support on this architecture");
-}
-
-ATF_TC(t_nofe_nextafter);
-
-ATF_TC_HEAD(t_nofe_nextafter, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "dummy test case - no fenv.h support");
-}
-
-ATF_TC_BODY(t_nofe_nextafter, tc)
-{
- atf_tc_skip("no fenv.h support on this architecture");
-}
-
-ATF_TC(t_nofe_nexttoward);
-
-ATF_TC_HEAD(t_nofe_nexttoward, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "dummy test case - no fenv.h support");
-}
-
-ATF_TC_BODY(t_nofe_nexttoward, tc)
-{
- atf_tc_skip("no fenv.h support on this architecture");
-}
+#else /* !__HAVE_FENV */
ATF_TP_ADD_TCS(tp)
{
- ATF_TP_ADD_TC(tp, t_nofe_round);
- ATF_TP_ADD_TC(tp, t_nofe_nearbyint);
- ATF_TP_ADD_TC(tp, t_nofe_nextafter);
- ATF_TP_ADD_TC(tp, t_nofe_nexttoward);
+
+ /*
+ * No fenv, no fesetround to test.
+ */
return atf_no_error();
}
-#endif
+#endif /* __HAVE_FENV */