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