t-cmp.c revision 1.1.1.1.8.1 1 1.1 mrg /* Test mpz_cmp and mpz_cmpabs.
2 1.1 mrg
3 1.1 mrg Copyright 2001 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1.1.1.8.1 tls This file is part of the GNU MP Library test suite.
6 1.1 mrg
7 1.1.1.1.8.1 tls The GNU MP Library test suite is free software; you can redistribute it
8 1.1.1.1.8.1 tls and/or modify it under the terms of the GNU General Public License as
9 1.1.1.1.8.1 tls published by the Free Software Foundation; either version 3 of the License,
10 1.1.1.1.8.1 tls or (at your option) any later version.
11 1.1.1.1.8.1 tls
12 1.1.1.1.8.1 tls The GNU MP Library test suite is distributed in the hope that it will be
13 1.1.1.1.8.1 tls useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1.1.1.8.1 tls MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 1.1.1.1.8.1 tls Public License for more details.
16 1.1 mrg
17 1.1.1.1.8.1 tls You should have received a copy of the GNU General Public License along with
18 1.1.1.1.8.1 tls the GNU MP Library test suite. If not, see http://www.gnu.org/licenses/. */
19 1.1 mrg
20 1.1 mrg #include <stdio.h>
21 1.1 mrg #include <stdlib.h>
22 1.1 mrg #include "gmp.h"
23 1.1 mrg #include "gmp-impl.h"
24 1.1 mrg #include "tests.h"
25 1.1 mrg
26 1.1 mrg
27 1.1 mrg /* Nothing sophisticated here, just exercise some combinations of sizes and
28 1.1 mrg signs. */
29 1.1 mrg
30 1.1 mrg
31 1.1 mrg void
32 1.1 mrg check_one (mpz_ptr x, mpz_ptr y, int want_cmp, int want_cmpabs)
33 1.1 mrg {
34 1.1 mrg int got;
35 1.1 mrg
36 1.1 mrg got = mpz_cmp (x, y);
37 1.1 mrg if (( got < 0) != (want_cmp < 0)
38 1.1 mrg || (got == 0) != (want_cmp == 0)
39 1.1 mrg || (got > 0) != (want_cmp > 0))
40 1.1 mrg {
41 1.1 mrg printf ("mpz_cmp got %d want %d\n", got, want_cmp);
42 1.1 mrg mpz_trace ("x", x);
43 1.1 mrg mpz_trace ("y", y);
44 1.1 mrg abort ();
45 1.1 mrg }
46 1.1 mrg
47 1.1 mrg got = mpz_cmpabs (x, y);
48 1.1 mrg if (( got < 0) != (want_cmpabs < 0)
49 1.1 mrg || (got == 0) != (want_cmpabs == 0)
50 1.1 mrg || (got > 0) != (want_cmpabs > 0))
51 1.1 mrg {
52 1.1 mrg printf ("mpz_cmpabs got %d want %d\n", got, want_cmpabs);
53 1.1 mrg mpz_trace ("x", x);
54 1.1 mrg mpz_trace ("y", y);
55 1.1 mrg abort ();
56 1.1 mrg }
57 1.1 mrg }
58 1.1 mrg
59 1.1 mrg
60 1.1 mrg void
61 1.1 mrg check_all (mpz_ptr x, mpz_ptr y, int want_cmp, int want_cmpabs)
62 1.1 mrg {
63 1.1 mrg check_one (x, y, want_cmp, want_cmpabs);
64 1.1 mrg check_one (y, x, -want_cmp, -want_cmpabs);
65 1.1 mrg
66 1.1 mrg mpz_neg (x, x);
67 1.1 mrg mpz_neg (y, y);
68 1.1 mrg want_cmp = -want_cmp;
69 1.1 mrg
70 1.1 mrg check_one (x, y, want_cmp, want_cmpabs);
71 1.1 mrg check_one (y, x, -want_cmp, -want_cmpabs);
72 1.1 mrg }
73 1.1 mrg
74 1.1 mrg
75 1.1 mrg #define SET1(z,size, n) \
76 1.1 mrg SIZ(z) = size; PTR(z)[0] = n
77 1.1 mrg
78 1.1 mrg #define SET2(z,size, n1,n0) \
79 1.1 mrg SIZ(z) = size; PTR(z)[1] = n1; PTR(z)[0] = n0
80 1.1 mrg
81 1.1 mrg #define SET4(z,size, n3,n2,n1,n0) \
82 1.1 mrg SIZ(z) = size; PTR(z)[3] = n3; PTR(z)[2] = n2; PTR(z)[1] = n1; PTR(z)[0] = n0
83 1.1 mrg
84 1.1 mrg void
85 1.1 mrg check_various (void)
86 1.1 mrg {
87 1.1 mrg mpz_t x, y;
88 1.1 mrg
89 1.1 mrg mpz_init (x);
90 1.1 mrg mpz_init (y);
91 1.1 mrg
92 1.1 mrg mpz_realloc (x, (mp_size_t) 20);
93 1.1 mrg mpz_realloc (y, (mp_size_t) 20);
94 1.1 mrg
95 1.1 mrg /* 0 cmp 0, junk in low limbs */
96 1.1 mrg SET1 (x,0, 123);
97 1.1 mrg SET1 (y,0, 456);
98 1.1 mrg check_all (x, y, 0, 0);
99 1.1 mrg
100 1.1 mrg
101 1.1 mrg /* 123 cmp 0 */
102 1.1 mrg SET1 (x,1, 123);
103 1.1 mrg SET1 (y,0, 456);
104 1.1 mrg check_all (x, y, 1, 1);
105 1.1 mrg
106 1.1 mrg /* 123:456 cmp 0 */
107 1.1 mrg SET2 (x,2, 456,123);
108 1.1 mrg SET1 (y,0, 9999);
109 1.1 mrg check_all (x, y, 1, 1);
110 1.1 mrg
111 1.1 mrg
112 1.1 mrg /* 123 cmp 123 */
113 1.1 mrg SET1(x,1, 123);
114 1.1 mrg SET1(y,1, 123);
115 1.1 mrg check_all (x, y, 0, 0);
116 1.1 mrg
117 1.1 mrg /* -123 cmp 123 */
118 1.1 mrg SET1(x,-1, 123);
119 1.1 mrg SET1(y,1, 123);
120 1.1 mrg check_all (x, y, -1, 0);
121 1.1 mrg
122 1.1 mrg
123 1.1 mrg /* 123 cmp 456 */
124 1.1 mrg SET1(x,1, 123);
125 1.1 mrg SET1(y,1, 456);
126 1.1 mrg check_all (x, y, -1, -1);
127 1.1 mrg
128 1.1 mrg /* -123 cmp 456 */
129 1.1 mrg SET1(x,-1, 123);
130 1.1 mrg SET1(y,1, 456);
131 1.1 mrg check_all (x, y, -1, -1);
132 1.1 mrg
133 1.1 mrg /* 123 cmp -456 */
134 1.1 mrg SET1(x,1, 123);
135 1.1 mrg SET1(y,-1, 456);
136 1.1 mrg check_all (x, y, 1, -1);
137 1.1 mrg
138 1.1 mrg
139 1.1 mrg /* 1:0 cmp 1:0 */
140 1.1 mrg SET2 (x,2, 1,0);
141 1.1 mrg SET2 (y,2, 1,0);
142 1.1 mrg check_all (x, y, 0, 0);
143 1.1 mrg
144 1.1 mrg /* -1:0 cmp 1:0 */
145 1.1 mrg SET2 (x,-2, 1,0);
146 1.1 mrg SET2 (y,2, 1,0);
147 1.1 mrg check_all (x, y, -1, 0);
148 1.1 mrg
149 1.1 mrg
150 1.1 mrg /* 2:0 cmp 1:0 */
151 1.1 mrg SET2 (x,2, 2,0);
152 1.1 mrg SET2 (y,2, 1,0);
153 1.1 mrg check_all (x, y, 1, 1);
154 1.1 mrg
155 1.1 mrg
156 1.1 mrg /* 4:3:2:1 cmp 2:1 */
157 1.1 mrg SET4 (x,4, 4,3,2,1);
158 1.1 mrg SET2 (y,2, 2,1);
159 1.1 mrg check_all (x, y, 1, 1);
160 1.1 mrg
161 1.1 mrg /* -4:3:2:1 cmp 2:1 */
162 1.1 mrg SET4 (x,-4, 4,3,2,1);
163 1.1 mrg SET2 (y,2, 2,1);
164 1.1 mrg check_all (x, y, -1, 1);
165 1.1 mrg
166 1.1 mrg
167 1.1 mrg mpz_clear (x);
168 1.1 mrg mpz_clear (y);
169 1.1 mrg }
170 1.1 mrg
171 1.1 mrg
172 1.1 mrg int
173 1.1 mrg main (void)
174 1.1 mrg {
175 1.1 mrg tests_start ();
176 1.1 mrg mp_trace_base = -16;
177 1.1 mrg
178 1.1 mrg check_various ();
179 1.1 mrg
180 1.1 mrg tests_end ();
181 1.1 mrg exit (0);
182 1.1 mrg }
183