1/* Test mpq_cmp_ui.
2
3Copyright 1996, 1997, 2001, 2002 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library test suite.
6
7The GNU MP Library test suite is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 3 of the License,
10or (at your option) any later version.
11
12The GNU MP Library test suite is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15Public License for more details.
16
17You should have received a copy of the GNU General Public License along with
18the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
19
20#include <stdio.h>
21#include <stdlib.h>
22
23#include "gmp-impl.h"
24#include "tests.h"
25
26#define SGN(x) ((x) < 0 ? -1 : (x) > 0 ? 1 : 0)
27
28int
29ref_mpq_cmp_ui (mpq_t a, unsigned long int bn, unsigned long int bd)
30{
31  mpz_t ai, bi;
32  int cc;
33
34  mpz_init (ai);
35  mpz_init (bi);
36
37  mpz_mul_ui (ai, NUM (a), bd);
38  mpz_mul_ui (bi, DEN (a), bn);
39  cc = mpz_cmp (ai, bi);
40  mpz_clear (ai);
41  mpz_clear (bi);
42  return cc;
43}
44
45#ifndef SIZE
46#define SIZE 8	/* increasing this lowers the probability of finding an error */
47#endif
48
49int
50main (int argc, char **argv)
51{
52  mpq_t a, b;
53  mp_size_t size;
54  int reps = 10000;
55  int i;
56  int cc, ccref;
57  unsigned long int bn, bd;
58
59  tests_start ();
60
61  if (argc == 2)
62     reps = atoi (argv[1]);
63
64  mpq_init (a);
65  mpq_init (b);
66
67  for (i = 0; i < reps; i++)
68    {
69      size = urandom () % SIZE - SIZE/2;
70      mpz_random2 (NUM (a), size);
71      do
72	{
73	  size = urandom () % SIZE - SIZE/2;
74	  mpz_random2 (DEN (a), size);
75	}
76      while (mpz_cmp_ui (DEN (a), 0) == 0);
77
78      mpz_random2 (NUM (b), (mp_size_t) 1);
79      mpz_mod_ui (NUM (b), NUM (b), ~(unsigned long int) 0);
80      mpz_add_ui (NUM (b), NUM (b), 1);
81
82      mpz_random2 (DEN (b), (mp_size_t) 1);
83      mpz_mod_ui (DEN (b), DEN (b), ~(unsigned long int) 0);
84      mpz_add_ui (DEN (b), DEN (b), 1);
85
86      mpq_canonicalize (a);
87      mpq_canonicalize (b);
88
89      ccref = ref_mpq_cmp_ui (a, 1, 1);
90      cc = mpq_cmp_ui (a, 1, 1);
91
92      if (SGN (ccref) != SGN (cc))
93	abort ();
94
95      ccref = ref_mpq_cmp_ui (a, 0, 1);
96      cc = mpq_cmp_ui (a, 0, 1);
97
98      if (SGN (ccref) != SGN (cc))
99	abort ();
100
101      bn = mpz_get_ui (NUM (b));
102      bd = mpz_get_ui (DEN (b));
103
104      ccref = ref_mpq_cmp_ui (a, bn, bd);
105      cc = mpq_cmp_ui (a, bn, bd);
106
107      if (SGN (ccref) != SGN (cc))
108	abort ();
109    }
110
111  mpq_clear (a);
112  mpq_clear (b);
113
114  tests_end ();
115  exit (0);
116}
117