Home | History | Annotate | Line # | Download | only in mpz
t-cmp.c revision 1.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  mrg This file is part of the GNU MP Library.
      6  1.1  mrg 
      7  1.1  mrg The GNU MP Library is free software; you can redistribute it and/or modify
      8  1.1  mrg it under the terms of the GNU Lesser General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     10  1.1  mrg option) any later version.
     11  1.1  mrg 
     12  1.1  mrg The GNU MP Library is distributed in the hope that it will be useful, but
     13  1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14  1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     15  1.1  mrg License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU Lesser General Public License
     18  1.1  mrg along with the GNU MP Library.  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