github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/mpz/t-cmp.c (about) 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.h" 23 #include "gmp-impl.h" 24 #include "tests.h" 25 26 27 /* Nothing sophisticated here, just exercise some combinations of sizes and 28 signs. */ 29 30 31 void 32 check_one (mpz_ptr x, mpz_ptr y, int want_cmp, int want_cmpabs) 33 { 34 int got; 35 36 got = mpz_cmp (x, y); 37 if (( got < 0) != (want_cmp < 0) 38 || (got == 0) != (want_cmp == 0) 39 || (got > 0) != (want_cmp > 0)) 40 { 41 printf ("mpz_cmp got %d want %d\n", got, want_cmp); 42 mpz_trace ("x", x); 43 mpz_trace ("y", y); 44 abort (); 45 } 46 47 got = mpz_cmpabs (x, y); 48 if (( got < 0) != (want_cmpabs < 0) 49 || (got == 0) != (want_cmpabs == 0) 50 || (got > 0) != (want_cmpabs > 0)) 51 { 52 printf ("mpz_cmpabs got %d want %d\n", got, want_cmpabs); 53 mpz_trace ("x", x); 54 mpz_trace ("y", y); 55 abort (); 56 } 57 } 58 59 60 void 61 check_all (mpz_ptr x, mpz_ptr y, int want_cmp, int want_cmpabs) 62 { 63 check_one (x, y, want_cmp, want_cmpabs); 64 check_one (y, x, -want_cmp, -want_cmpabs); 65 66 mpz_neg (x, x); 67 mpz_neg (y, y); 68 want_cmp = -want_cmp; 69 70 check_one (x, y, want_cmp, want_cmpabs); 71 check_one (y, x, -want_cmp, -want_cmpabs); 72 } 73 74 75 #define SET1(z,size, n) \ 76 SIZ(z) = size; PTR(z)[0] = n 77 78 #define SET2(z,size, n1,n0) \ 79 SIZ(z) = size; PTR(z)[1] = n1; PTR(z)[0] = n0 80 81 #define SET4(z,size, n3,n2,n1,n0) \ 82 SIZ(z) = size; PTR(z)[3] = n3; PTR(z)[2] = n2; PTR(z)[1] = n1; PTR(z)[0] = n0 83 84 void 85 check_various (void) 86 { 87 mpz_t x, y; 88 89 mpz_init (x); 90 mpz_init (y); 91 92 mpz_realloc (x, (mp_size_t) 20); 93 mpz_realloc (y, (mp_size_t) 20); 94 95 /* 0 cmp 0, junk in low limbs */ 96 SET1 (x,0, 123); 97 SET1 (y,0, 456); 98 check_all (x, y, 0, 0); 99 100 101 /* 123 cmp 0 */ 102 SET1 (x,1, 123); 103 SET1 (y,0, 456); 104 check_all (x, y, 1, 1); 105 106 /* 123:456 cmp 0 */ 107 SET2 (x,2, 456,123); 108 SET1 (y,0, 9999); 109 check_all (x, y, 1, 1); 110 111 112 /* 123 cmp 123 */ 113 SET1(x,1, 123); 114 SET1(y,1, 123); 115 check_all (x, y, 0, 0); 116 117 /* -123 cmp 123 */ 118 SET1(x,-1, 123); 119 SET1(y,1, 123); 120 check_all (x, y, -1, 0); 121 122 123 /* 123 cmp 456 */ 124 SET1(x,1, 123); 125 SET1(y,1, 456); 126 check_all (x, y, -1, -1); 127 128 /* -123 cmp 456 */ 129 SET1(x,-1, 123); 130 SET1(y,1, 456); 131 check_all (x, y, -1, -1); 132 133 /* 123 cmp -456 */ 134 SET1(x,1, 123); 135 SET1(y,-1, 456); 136 check_all (x, y, 1, -1); 137 138 139 /* 1:0 cmp 1:0 */ 140 SET2 (x,2, 1,0); 141 SET2 (y,2, 1,0); 142 check_all (x, y, 0, 0); 143 144 /* -1:0 cmp 1:0 */ 145 SET2 (x,-2, 1,0); 146 SET2 (y,2, 1,0); 147 check_all (x, y, -1, 0); 148 149 150 /* 2:0 cmp 1:0 */ 151 SET2 (x,2, 2,0); 152 SET2 (y,2, 1,0); 153 check_all (x, y, 1, 1); 154 155 156 /* 4:3:2:1 cmp 2:1 */ 157 SET4 (x,4, 4,3,2,1); 158 SET2 (y,2, 2,1); 159 check_all (x, y, 1, 1); 160 161 /* -4:3:2:1 cmp 2:1 */ 162 SET4 (x,-4, 4,3,2,1); 163 SET2 (y,2, 2,1); 164 check_all (x, y, -1, 1); 165 166 167 mpz_clear (x); 168 mpz_clear (y); 169 } 170 171 172 int 173 main (void) 174 { 175 tests_start (); 176 mp_trace_base = -16; 177 178 check_various (); 179 180 tests_end (); 181 exit (0); 182 }