From 11da511c784eca003deb90c23570f0873954e0de Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Sat, 18 Nov 2023 06:11:09 -0600 Subject: Initial commit. --- gmp-6.3.0/tests/mpq/t-cmp_z.c | 146 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 gmp-6.3.0/tests/mpq/t-cmp_z.c (limited to 'gmp-6.3.0/tests/mpq/t-cmp_z.c') diff --git a/gmp-6.3.0/tests/mpq/t-cmp_z.c b/gmp-6.3.0/tests/mpq/t-cmp_z.c new file mode 100644 index 0000000..3e66a3c --- /dev/null +++ b/gmp-6.3.0/tests/mpq/t-cmp_z.c @@ -0,0 +1,146 @@ +/* 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 +#include + +#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 + +#ifndef MAXN +#define MAXN 5 /* increasing this impatcs on total timing */ +#endif + +void +sizes_test (int m) +{ + mpq_t a; + mpz_t b; + int i, j, k, s; + int cc, ccref; + + mpq_init (a); + mpz_init (b); + + for (i = 0; i <= MAXN ; ++i) + { + mpz_setbit (DEN (a), i*m); /* \sum_0^i 2^(i*m) */ + for (j = 0; j <= MAXN; ++j) + { + mpz_set_ui (NUM (a), 0); + mpz_setbit (NUM (a), j*m); /* 2^(j*m) */ + for (k = 0; k <= MAXN; ++k) + { + mpz_set_ui (b, 0); + mpz_setbit (b, k*m); /* 2^(k*m) */ + if (i == 0) /* Denominator is 1, compare the two exponents */ + ccref = (j>k)-(j k ? 1 : -1; + for (s = 1; s >= -1; s -= 2) + { + cc = mpq_cmp_z (a, b); + + if (ccref != SGN (cc)) + { + fprintf (stderr, "i=%i, j=%i, k=%i, m=%i, s=%i\n; ccref= %i, cc= %i\n", i, j, k, m, s, ccref, cc); + abort (); + } + + mpq_neg (a, a); + mpz_neg (b, b); + ccref = - ccref; + } + } + } + } + + mpq_clear (a); + mpz_clear (b); +} + +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++) + { + if (i % 8192 == 0) + sizes_test (urandom () % (i + 1) + 1); + 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); +} -- cgit v1.2.3