blob: 187db7fa4e6fac1ff8f5dc39ffe0f58b9f641792 [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001/* Test mpq_cmp.
2
3Copyright 1996, 2001 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 (mpq_t a, mpq_t b)
30{
31 mpz_t ai, bi;
32 int cc;
33
34 mpz_init (ai);
35 mpz_init (bi);
36
37 mpz_mul (ai, NUM (a), DEN (b));
38 mpz_mul (bi, NUM (b), DEN (a));
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
58 tests_start ();
59
60 if (argc == 2)
61 reps = atoi (argv[1]);
62
63 mpq_init (a);
64 mpq_init (b);
65
66 for (i = 0; i < reps; i++)
67 {
68 size = urandom () % SIZE - SIZE/2;
69 mpz_random2 (NUM (a), size);
70 do
71 {
72 size = urandom () % SIZE - SIZE/2;
73 mpz_random2 (DEN (a), size);
74 }
75 while (mpz_cmp_ui (DEN (a), 0) == 0);
76
77 size = urandom () % SIZE - SIZE/2;
78 mpz_random2 (NUM (b), size);
79 do
80 {
81 size = urandom () % SIZE - SIZE/2;
82 mpz_random2 (DEN (b), size);
83 }
84 while (mpz_cmp_ui (DEN (b), 0) == 0);
85
86 mpq_canonicalize (a);
87 mpq_canonicalize (b);
88
89 ccref = ref_mpq_cmp (a, b);
90 cc = mpq_cmp (a, b);
91
92 if (SGN (ccref) != SGN (cc))
93 abort ();
94 }
95
96 mpq_clear (a);
97 mpq_clear (b);
98
99 tests_end ();
100 exit (0);
101}