Home | History | Annotate | Line # | Download | only in mpq
t-aors.c revision 1.1.1.2
      1      1.1  mrg /* Test mpq_add and mpq_sub.
      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 "config.h"
     21      1.1  mrg 
     22      1.1  mrg #include <stdio.h>
     23      1.1  mrg #include <stdlib.h>
     24      1.1  mrg #include <string.h>
     25      1.1  mrg 
     26      1.1  mrg #include "gmp.h"
     27      1.1  mrg #include "gmp-impl.h"
     28      1.1  mrg #include "tests.h"
     29      1.1  mrg 
     30      1.1  mrg 
     31      1.1  mrg void
     32      1.1  mrg check_all (mpq_ptr x, mpq_ptr y, mpq_ptr want_add, mpq_ptr want_sub)
     33      1.1  mrg {
     34      1.1  mrg   mpq_t  got;
     35      1.1  mrg   int    neg_x, neg_y, swap;
     36      1.1  mrg 
     37      1.1  mrg   mpq_init (got);
     38      1.1  mrg 
     39      1.1  mrg   MPQ_CHECK_FORMAT (want_add);
     40      1.1  mrg   MPQ_CHECK_FORMAT (want_sub);
     41      1.1  mrg   MPQ_CHECK_FORMAT (x);
     42      1.1  mrg   MPQ_CHECK_FORMAT (y);
     43      1.1  mrg 
     44      1.1  mrg   for (swap = 0; swap <= 1; swap++)
     45      1.1  mrg     {
     46      1.1  mrg       for (neg_x = 0; neg_x <= 1; neg_x++)
     47      1.1  mrg         {
     48      1.1  mrg           for (neg_y = 0; neg_y <= 1; neg_y++)
     49      1.1  mrg             {
     50      1.1  mrg               mpq_add (got, x, y);
     51      1.1  mrg               MPQ_CHECK_FORMAT (got);
     52      1.1  mrg               if (! mpq_equal (got, want_add))
     53      1.1  mrg                 {
     54      1.1  mrg                   printf ("mpq_add wrong\n");
     55      1.1  mrg                   mpq_trace ("  x   ", x);
     56      1.1  mrg                   mpq_trace ("  y   ", y);
     57      1.1  mrg                   mpq_trace ("  got ", got);
     58      1.1  mrg                   mpq_trace ("  want", want_add);
     59      1.1  mrg                   abort ();
     60      1.1  mrg                 }
     61      1.1  mrg 
     62      1.1  mrg               mpq_sub (got, x, y);
     63      1.1  mrg               MPQ_CHECK_FORMAT (got);
     64      1.1  mrg               if (! mpq_equal (got, want_sub))
     65      1.1  mrg                 {
     66      1.1  mrg                   printf ("mpq_sub wrong\n");
     67      1.1  mrg                   mpq_trace ("  x   ", x);
     68      1.1  mrg                   mpq_trace ("  y   ", y);
     69      1.1  mrg                   mpq_trace ("  got ", got);
     70      1.1  mrg                   mpq_trace ("  want", want_sub);
     71      1.1  mrg                   abort ();
     72      1.1  mrg                 }
     73      1.1  mrg 
     74      1.1  mrg 
     75      1.1  mrg               mpq_neg (y, y);
     76      1.1  mrg               mpq_swap (want_add, want_sub);
     77      1.1  mrg             }
     78      1.1  mrg 
     79      1.1  mrg           mpq_neg (x, x);
     80      1.1  mrg           mpq_swap (want_add, want_sub);
     81      1.1  mrg           mpq_neg (want_add, want_add);
     82      1.1  mrg           mpq_neg (want_sub, want_sub);
     83      1.1  mrg         }
     84      1.1  mrg 
     85      1.1  mrg       mpq_swap (x, y);
     86      1.1  mrg       mpq_neg (want_sub, want_sub);
     87      1.1  mrg     }
     88      1.1  mrg 
     89      1.1  mrg   mpq_clear (got);
     90      1.1  mrg }
     91      1.1  mrg 
     92      1.1  mrg 
     93      1.1  mrg void
     94      1.1  mrg check_data (void)
     95      1.1  mrg {
     96      1.1  mrg   static const struct {
     97      1.1  mrg     const char  *x;
     98      1.1  mrg     const char  *y;
     99      1.1  mrg     const char  *want_add;
    100      1.1  mrg     const char  *want_sub;
    101      1.1  mrg 
    102      1.1  mrg   } data[] = {
    103      1.1  mrg 
    104      1.1  mrg     { "0", "0", "0", "0" },
    105      1.1  mrg     { "1", "0", "1", "1" },
    106      1.1  mrg     { "1", "1", "2", "0" },
    107      1.1  mrg 
    108      1.1  mrg     { "1/2", "1/2", "1", "0" },
    109      1.1  mrg     { "5/6", "14/15", "53/30", "-1/10" },
    110      1.1  mrg   };
    111      1.1  mrg 
    112      1.1  mrg   mpq_t  x, y, want_add, want_sub;
    113      1.1  mrg   int i;
    114      1.1  mrg 
    115      1.1  mrg   mpq_init (x);
    116      1.1  mrg   mpq_init (y);
    117      1.1  mrg   mpq_init (want_add);
    118      1.1  mrg   mpq_init (want_sub);
    119      1.1  mrg 
    120      1.1  mrg   for (i = 0; i < numberof (data); i++)
    121      1.1  mrg     {
    122      1.1  mrg       mpq_set_str_or_abort (x, data[i].x, 0);
    123      1.1  mrg       mpq_set_str_or_abort (y, data[i].y, 0);
    124      1.1  mrg       mpq_set_str_or_abort (want_add, data[i].want_add, 0);
    125      1.1  mrg       mpq_set_str_or_abort (want_sub, data[i].want_sub, 0);
    126      1.1  mrg 
    127      1.1  mrg       check_all (x, y, want_add, want_sub);
    128      1.1  mrg     }
    129      1.1  mrg 
    130      1.1  mrg   mpq_clear (x);
    131      1.1  mrg   mpq_clear (y);
    132      1.1  mrg   mpq_clear (want_add);
    133      1.1  mrg   mpq_clear (want_sub);
    134      1.1  mrg }
    135      1.1  mrg 
    136      1.1  mrg 
    137      1.1  mrg void
    138      1.1  mrg check_rand (void)
    139      1.1  mrg {
    140      1.1  mrg   mpq_t  x, y, want_add, want_sub;
    141      1.1  mrg   int i;
    142      1.1  mrg   gmp_randstate_ptr  rands = RANDS;
    143      1.1  mrg 
    144      1.1  mrg   mpq_init (x);
    145      1.1  mrg   mpq_init (y);
    146      1.1  mrg   mpq_init (want_add);
    147      1.1  mrg   mpq_init (want_sub);
    148      1.1  mrg 
    149      1.1  mrg   for (i = 0; i < 500; i++)
    150      1.1  mrg     {
    151      1.1  mrg       mpz_errandomb (mpq_numref(x), rands, 512L);
    152      1.1  mrg       mpz_errandomb_nonzero (mpq_denref(x), rands, 512L);
    153      1.1  mrg       mpq_canonicalize (x);
    154      1.1  mrg 
    155      1.1  mrg       mpz_errandomb (mpq_numref(y), rands, 512L);
    156      1.1  mrg       mpz_errandomb_nonzero (mpq_denref(y), rands, 512L);
    157      1.1  mrg       mpq_canonicalize (y);
    158      1.1  mrg 
    159      1.1  mrg       refmpq_add (want_add, x, y);
    160      1.1  mrg       refmpq_sub (want_sub, x, y);
    161      1.1  mrg 
    162      1.1  mrg       check_all (x, y, want_add, want_sub);
    163      1.1  mrg     }
    164      1.1  mrg 
    165      1.1  mrg   mpq_clear (x);
    166      1.1  mrg   mpq_clear (y);
    167      1.1  mrg   mpq_clear (want_add);
    168      1.1  mrg   mpq_clear (want_sub);
    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 
    177      1.1  mrg   check_data ();
    178      1.1  mrg   check_rand ();
    179      1.1  mrg 
    180      1.1  mrg   tests_end ();
    181      1.1  mrg 
    182      1.1  mrg   exit (0);
    183      1.1  mrg }
    184