Linux Test Project
 help / color / mirror / Atom feed
* [LTP] [PATCH] nextafter01: Check exact results and convert to new API
@ 2026-10-19 12:35 Jan Stancek via ltp
  2026-10-19 13:13 ` Petr Vorel
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Jan Stancek via ltp @ 2026-10-19 12:35 UTC (permalink / raw)
  To: ltp

The test can hardly fail. Block 1 accepts nextafter(1.0, 1.1) whenever
(answer + 1.0) / 2 rounds to 1.0 as a float, which is also true when
nextafter() returns 1.0 unchanged. Block 2 never recomputes 'check'
and compares the stale value from block 1, which is exactly 1.0, so its
'check != 1.0' condition is always false and any return value passes.
Only the x == y case in block 3 is really verified. The file header also
names the test "scalb".

Compare the results with the exact next doubles instead: 1.0 + 2^-52
above and 1.0 - 2^-53 below. Both are exactly representable, so a plain
equality test is sufficient. Rewrite the test with the new API while at
it and fix the description.

Signed-off-by: Jan Stancek <jstancek@redhat.com>
---
 testcases/misc/math/nextafter/nextafter01.c | 145 +++++---------------
 1 file changed, 33 insertions(+), 112 deletions(-)

diff --git a/testcases/misc/math/nextafter/nextafter01.c b/testcases/misc/math/nextafter/nextafter01.c
index f4b212d4daa2..a74b7dc8e974 100644
--- a/testcases/misc/math/nextafter/nextafter01.c
+++ b/testcases/misc/math/nextafter/nextafter01.c
@@ -1,127 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
- *
- *   Copyright (c) International Business Machines  Corp., 2002
- *
- *   This program is free software;  you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
- *   the GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program;  if not, write to the Free Software
- *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Copyright (c) International Business Machines Corp., 2002
+ * Copyright (c) 2026 Jan Stancek <jstancek@redhat.com>
  */
 
-/* 01/02/2003	Port to LTP	avenkat@us.ibm.com */
-/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
-
-/*
- * NAME
- *      scalb
+/*\
+ * Verify that nextafter() returns the next representable double in the
+ * direction of its second argument:
  *
- * CALLS
- *      nextafter(3C)
- *
- * ALGORITHM
- *	Check results from the above functions against expected values.
- *
- * RESTRICTIONS
- * 	Checks for basic functionality, nothing fancy
+ * - nextafter(1.0, 1.1) is 1.0 + 2^-52 (DBL_EPSILON)
+ * - nextafter(1.0, 0.9) is 1.0 - 2^-53
+ * - nextafter(1.0, 1.0) is 1.0
  */
 
-#include <errno.h>
 #include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "test.h"
+#include "tst_test.h"
 
-#define	FAILED 0
-#define	PASSED 1
+/* DBL_EPSILON spelled out, as sparse does not know __DBL_EPSILON__ */
+#define EPSILON (1.0 / (1ULL << 52))
 
-char *TCID = "nextafter01";
+static struct tcase {
+	double x;
+	double y;
+	double exp;
+} tcases[] = {
+	{1.0, 1.1, 1.0 + EPSILON},
+	{1.0, 0.9, 1.0 - EPSILON / 2},
+	{1.0, 1.0, 1.0},
+};
 
-int local_flag = PASSED;
-int block_number;
-FILE *temp;
-int TST_TOTAL = 1;
-
-void setup();
-void blenter();
-void blexit();
-
-/*--------------------------------------------------------------*/
-int main()
+static void run(unsigned int n)
 {
-	double answer;
-	double check;		/* tmp variable */
+	struct tcase *tc = &tcases[n];
+	double ret = nextafter(tc->x, tc->y);
 
-	setup();		/* temp file is now open */
-/*--------------------------------------------------------------*/
-	blenter();
-
-	answer = nextafter(1.0, 1.1);
-	check = (answer + 1.0) / 2;
-	if ((check != answer) && ((float)check != 1.0)) {
-		fprintf(temp, "nextafter returned %e, expected answer or 1.0\n",
-			answer);
-		local_flag = FAILED;
+	if (ret == tc->exp) {
+		tst_res(TPASS, "nextafter(%g, %g) == %.17g", tc->x, tc->y, ret);
+	} else {
+		tst_res(TFAIL, "nextafter(%g, %g) == %.17g, expected %.17g",
+			tc->x, tc->y, ret, tc->exp);
 	}
-
-	blexit();
-/*--------------------------------------------------------------*/
-	blenter();
-
-	answer = nextafter(1.0, 0.9);
-	if ((check != answer) && (check != 1.0)) {
-		fprintf(temp, "nextafter returned %e, expected answer or 1.0\n",
-			answer);
-		local_flag = FAILED;
-	}
-
-	blexit();
-/*--------------------------------------------------------------*/
-	blenter();
-
-	answer = nextafter(1.0, 1.0);
-	if (answer != 1.0) {
-		fprintf(temp, "nextafter 3 returned %e, expected 1.0\n",
-			answer);
-		local_flag = FAILED;
-	}
-
-	blexit();
-/*--------------------------------------------------------------*/
-
-	tst_exit();
 }
 
-/*--------------------------------------------------------------*/
-
-/*****	*****	LTP Port	*****/
-
-/* FUNCTIONS */
-
-void setup()
-{
-	temp = stderr;
-}
-
-void blenter()
-{
-	local_flag = PASSED;
-}
-
-void blexit()
-{
-	if (local_flag == PASSED)
-		tst_resm(TPASS, "Test passed");
-	else
-		tst_resm(TFAIL, "Test failed");
-}
-
-/*****	*****		*****/
+static struct tst_test test = {
+	.test = run,
+	.tcnt = ARRAY_SIZE(tcases),
+};
-- 
2.56.0


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-10-20 10:07 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-19 12:35 [LTP] [PATCH] nextafter01: Check exact results and convert to new API Jan Stancek via ltp
2026-10-19 13:13 ` Petr Vorel
2026-10-20 10:03   ` Andrea Cervesato via ltp
2026-10-20 10:06     ` Petr Vorel
2026-10-19 19:05 ` [LTP] " linuxtestproject.agent
2026-10-19 21:08 ` [LTP] [PATCH] " Avinesh Kumar via ltp

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox