diff options
author | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2015-08-31 10:39:44 +0200 |
---|---|---|
committer | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2015-08-31 10:39:44 +0200 |
commit | d987a156c169a0f9bf3d510852aa5592b73df6df (patch) | |
tree | c26cacb2b16926789a3692306333246e07dfdde7 /tests/mpq | |
parent | 625e4fead5ae991ba3c67fb5f7cdf8b07ecde216 (diff) | |
download | gmp-d987a156c169a0f9bf3d510852aa5592b73df6df.tar.gz |
New function mpq_cmp_z, with test and documentation
Diffstat (limited to 'tests/mpq')
-rw-r--r-- | tests/mpq/Makefile.am | 4 | ||||
-rw-r--r-- | tests/mpq/t-cmp_z.c | 93 |
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); +} |