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