2024-04-18 Bruno Haible <bruno@clisp.org>
+ totalordermag: Add tests.
+ * tests/test-totalordermag.c: New file, based on
+ tests/test-totalorder.c.
+ * tests/test-totalordermag.h: New file, based on
+ tests/test-totalorder.h.
+ * modules/totalordermag-tests: New file, based on
+ modules/totalorder-tests.
+
totalordermag: New module.
* lib/math.in.h (totalordermag): New declaration.
* lib/totalordermag.c: New file, based on lib/totalorder.c.
--- /dev/null
+Files:
+tests/test-totalordermag.c
+tests/test-totalordermag.h
+tests/minus-zero.h
+tests/infinity.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+signed-nan
+signed-snan
+setpayload
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-totalordermag
+check_PROGRAMS += test-totalordermag
+test_totalordermag_LDADD = $(LDADD) @TOTALORDERMAG_LIBM@ $(SETPAYLOAD_LIBM)
--- /dev/null
+/* Test totalordermag.
+ Copyright 2023-2024 Free Software Foundation, Inc.
+
+ 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 3 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, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (totalordermag, int, (const double *, const double *));
+
+#define TOTALORDER totalordermag
+#define TOTALORDER_TYPE memory_double
+#define TOTALORDER_INF Infinityd
+#define TOTALORDER_MINUS_ZERO minus_zerod
+#define TOTALORDER_SETPAYLOAD setpayload
+#define TOTALORDER_HAVE_SNAN HAVE_SNAND
+#define TOTALORDER_POSITIVE_SNAN memory_positive_SNaNd
+#define TOTALORDER_NEGATIVE_SNAN memory_negative_SNaNd
+#include "test-totalordermag.h"
--- /dev/null
+/* Test a totalordermag-like function.
+ Copyright 2023-2024 Free Software Foundation, Inc.
+
+ 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 3 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, see <https://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+
+#include <math.h>
+#include "infinity.h"
+#include "macros.h"
+#include "minus-zero.h"
+#include "signed-nan.h"
+#include "signed-snan.h"
+
+static TOTALORDER_TYPE
+positive_NaN_with_payload (int payload)
+{
+ TOTALORDER_TYPE x;
+ ASSERT (TOTALORDER_SETPAYLOAD (&x.value, payload) == 0);
+ return x;
+}
+
+static TOTALORDER_TYPE
+negative_NaN_with_payload (int payload)
+{
+ TOTALORDER_TYPE x;
+ ASSERT (TOTALORDER_SETPAYLOAD (&x.value, payload) == 0);
+ x.value = - x.value;
+ return x;
+}
+
+int
+main ()
+{
+ TOTALORDER_TYPE x[] =
+ {
+ negative_NaN_with_payload (1729),
+ negative_NaN_with_payload (641),
+#if TOTALORDER_HAVE_SNAN
+ TOTALORDER_NEGATIVE_SNAN (),
+#endif
+ { -TOTALORDER_INF () },
+ { -1e37 },
+ { -1 },
+ { -1e-5 },
+ { TOTALORDER_MINUS_ZERO },
+ { 0 },
+ { 1e-5 },
+ { 1 },
+ { 1e37 },
+ { TOTALORDER_INF () },
+#if TOTALORDER_HAVE_SNAN
+ TOTALORDER_POSITIVE_SNAN (),
+#endif
+ positive_NaN_with_payload (641),
+ positive_NaN_with_payload (1729)
+ };
+ int n = SIZEOF (x);
+ int result = 0;
+
+ for (int i = 0; i < n; i++)
+ for (int j = 0; j < n; j++)
+ if (!(!!TOTALORDER (&x[i].value, &x[j].value)
+ == ((i < n / 2 ? n - 1 - i : i) <= (j < n /2 ? n - 1 - j : j))))
+ {
+ fprintf (stderr, "Failed: i=%d j=%d\n", i, j);
+ result = 1;
+ }
+
+ return result;
+}