Home | History | Annotate | Line # | Download | only in mpz
t-cmp.c revision 1.1.1.2
      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.2  mrg 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