summaryrefslogtreecommitdiff
path: root/tests/mpq
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2015-08-31 10:39:44 +0200
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2015-08-31 10:39:44 +0200
commitd987a156c169a0f9bf3d510852aa5592b73df6df (patch)
treec26cacb2b16926789a3692306333246e07dfdde7 /tests/mpq
parent625e4fead5ae991ba3c67fb5f7cdf8b07ecde216 (diff)
downloadgmp-d987a156c169a0f9bf3d510852aa5592b73df6df.tar.gz
New function mpq_cmp_z, with test and documentation
Diffstat (limited to 'tests/mpq')
-rw-r--r--tests/mpq/Makefile.am4
-rw-r--r--tests/mpq/t-cmp_z.c93
2 files changed, 95 insertions, 2 deletions
diff --git a/tests/mpq/Makefile.am b/tests/mpq/Makefile.am
index b8d443742..41578fafa 100644
--- a/tests/mpq/Makefile.am
+++ b/tests/mpq/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to generate Makefile.in
-# Copyright 1996, 1999-2002, 2012 Free Software Foundation, Inc.
+# Copyright 1996, 1999-2002, 2012, 2015 Free Software Foundation, Inc.
#
# This file is part of the GNU MP Library test suite.
#
@@ -22,7 +22,7 @@ AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/tests
LDADD = $(top_builddir)/tests/libtests.la $(top_builddir)/libgmp.la
check_PROGRAMS = t-aors t-cmp t-cmp_ui t-cmp_si t-equal t-get_d t-get_str \
- t-inp_str t-inv t-md_2exp t-set_f t-set_str io reuse
+ t-inp_str t-inv t-md_2exp t-set_f t-set_str io reuse t-cmp_z
TESTS = $(check_PROGRAMS)
# Temporary files used by the tests. Removed automatically if the tests
diff --git a/tests/mpq/t-cmp_z.c b/tests/mpq/t-cmp_z.c
new file mode 100644
index 000000000..0686101c0
--- /dev/null
+++ b/tests/mpq/t-cmp_z.c
@@ -0,0 +1,93 @@
+/* Test mpq_cmp_z.
+
+Copyright 1996, 2001, 2015 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library test suite.
+
+The GNU MP Library test suite 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.
+
+The GNU MP Library test suite 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
+the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gmp.h"
+#include "gmp-impl.h"
+#include "tests.h"
+
+#define SGN(x) ((x) < 0 ? -1 : (x) > 0 ? 1 : 0)
+
+int
+ref_mpq_cmp_z (mpq_t a, mpz_t b)
+{
+ mpz_t bi;
+ int cc;
+
+ mpz_init (bi);
+
+ mpz_mul (bi, b, DEN (a));
+ cc = mpz_cmp (NUM (a), bi);
+ mpz_clear (bi);
+ return cc;
+}
+
+#ifndef SIZE
+#define SIZE 8 /* increasing this lowers the probability of finding an error */
+#endif
+
+int
+main (int argc, char **argv)
+{
+ mpq_t a;
+ mpz_t b;
+ mp_size_t size;
+ int reps = 10000;
+ int i;
+ int cc, ccref;
+
+ tests_start ();
+
+ if (argc == 2)
+ reps = atoi (argv[1]);
+
+ mpq_init (a);
+ mpz_init (b);
+
+ for (i = 0; i < reps; i++)
+ {
+ size = urandom () % SIZE - SIZE/2;
+ mpz_random2 (NUM (a), size);
+ do
+ {
+ size = urandom () % (SIZE/2);
+ mpz_random2 (DEN (a), size);
+ }
+ while (mpz_cmp_ui (DEN (a), 0) == 0);
+
+ size = urandom () % SIZE - SIZE/2;
+ mpz_random2 (b, size);
+
+ mpq_canonicalize (a);
+
+ ccref = ref_mpq_cmp_z (a, b);
+ cc = mpq_cmp_z (a, b);
+
+ if (SGN (ccref) != SGN (cc))
+ abort ();
+ }
+
+ mpq_clear (a);
+ mpz_clear (b);
+
+ tests_end ();
+ exit (0);
+}