github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/mpq/t-aors.c (about)

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