github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/cxx/t-ops.cc (about)

     1  /* Test mp*_class operators and functions.
     2  
     3  Copyright 2001-2003, 2015 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 <iostream>
    23  
    24  #include "gmp.h"
    25  #include "gmpxx.h"
    26  #include "gmp-impl.h"
    27  #include "tests.h"
    28  
    29  using namespace std;
    30  
    31  
    32  void
    33  check_mpz (void)
    34  {
    35    // unary operators and functions
    36  
    37    // operator+
    38    {
    39      mpz_class a(1);
    40      mpz_class b;
    41      b = +a; ASSERT_ALWAYS(b == 1);
    42    }
    43  
    44    // operator-
    45    {
    46      mpz_class a(2);
    47      mpz_class b;
    48      b = -a; ASSERT_ALWAYS(b == -2);
    49    }
    50  
    51    // operator~
    52    {
    53      mpz_class a(3);
    54      mpz_class b;
    55      b = ~a; ASSERT_ALWAYS(b == -4);
    56    }
    57  
    58    // abs
    59    {
    60      mpz_class a(-123);
    61      mpz_class b;
    62      b = abs(a); ASSERT_ALWAYS(b == 123);
    63      a <<= 300;
    64      b = abs(a); ASSERT_ALWAYS(a + b == 0);
    65    }
    66  
    67    // sqrt
    68    {
    69      mpz_class a(25);
    70      mpz_class b;
    71      b = sqrt(a); ASSERT_ALWAYS(b == 5);
    72    }
    73    {
    74      mpz_class a(125);
    75      mpz_class b;
    76      b = sqrt(a); ASSERT_ALWAYS(b == 11); // round toward zero
    77    }
    78  
    79    // sgn
    80    {
    81      mpz_class a(123);
    82      int b = sgn(a); ASSERT_ALWAYS(b == 1);
    83    }
    84    {
    85      mpz_class a(0);
    86      int b = sgn(a); ASSERT_ALWAYS(b == 0);
    87    }
    88    {
    89      mpz_class a(-123);
    90      int b = sgn(a); ASSERT_ALWAYS(b == -1);
    91    }
    92  
    93  
    94    // binary operators and functions
    95  
    96    // operator+
    97    {
    98      mpz_class a(1), b(2);
    99      mpz_class c;
   100      c = a + b; ASSERT_ALWAYS(c == 3);
   101    }
   102    {
   103      mpz_class a(3);
   104      signed int b = 4;
   105      mpz_class c;
   106      c = a + b; ASSERT_ALWAYS(c == 7);
   107    }
   108    {
   109      mpz_class a(5);
   110      double b = 6.0;
   111      mpz_class c;
   112      c = b + a; ASSERT_ALWAYS(c == 11);
   113    }
   114  
   115    // operator-
   116    {
   117      mpz_class a(3), b(6);
   118      mpz_class c;
   119      c = a - b; ASSERT_ALWAYS(c == -3);
   120    }
   121  
   122    // operator*
   123    {
   124      mpz_class a(-2), b(4);
   125      mpz_class c;
   126      c = a * b; ASSERT_ALWAYS(c == -8);
   127    }
   128    {
   129      mpz_class a(2);
   130      long b = -4;
   131      mpz_class c;
   132      c = a * b; ASSERT_ALWAYS(c == -8);
   133      c = b * a; ASSERT_ALWAYS(c == -8);
   134    }
   135    {
   136      mpz_class a(-2);
   137      unsigned long b = 4;
   138      mpz_class c;
   139      c = a * b; ASSERT_ALWAYS(c == -8);
   140      c = b * a; ASSERT_ALWAYS(c == -8);
   141    }
   142  
   143    // operator/ and operator%
   144    {
   145      mpz_class a(12), b(4);
   146      mpz_class c;
   147      c = a / b; ASSERT_ALWAYS(c == 3);
   148      c = a % b; ASSERT_ALWAYS(c == 0);
   149    }
   150    {
   151      mpz_class a(7), b(5);
   152      mpz_class c;
   153      c = a / b; ASSERT_ALWAYS(c == 1);
   154      c = a % b; ASSERT_ALWAYS(c == 2);
   155    }
   156    {
   157      mpz_class a(-10);
   158      signed int ai = -10;
   159      mpz_class b(3);
   160      signed int bi = 3;
   161      mpz_class c;
   162      c = a / b;  ASSERT_ALWAYS(c == -3);
   163      c = a % b;  ASSERT_ALWAYS(c == -1);
   164      c = a / bi; ASSERT_ALWAYS(c == -3);
   165      c = a % bi; ASSERT_ALWAYS(c == -1);
   166      c = ai / b; ASSERT_ALWAYS(c == -3);
   167      c = ai % b; ASSERT_ALWAYS(c == -1);
   168    }
   169    {
   170      mpz_class a(-10);
   171      signed int ai = -10;
   172      mpz_class b(-3);
   173      signed int bi = -3;
   174      mpz_class c;
   175      c = a / b;  ASSERT_ALWAYS(c == 3);
   176      c = a % b;  ASSERT_ALWAYS(c == -1);
   177      c = a / bi; ASSERT_ALWAYS(c == 3);
   178      c = a % bi; ASSERT_ALWAYS(c == -1);
   179      c = ai / b; ASSERT_ALWAYS(c == 3);
   180      c = ai % b; ASSERT_ALWAYS(c == -1);
   181    }
   182    {
   183      mpz_class a (LONG_MIN);
   184      signed long ai = LONG_MIN;
   185      mpz_class b = - mpz_class (LONG_MIN);
   186      mpz_class c;
   187      c = a / b;  ASSERT_ALWAYS(c == -1);
   188      c = a % b;  ASSERT_ALWAYS(c == 0);
   189      c = ai / b; ASSERT_ALWAYS(c == -1);
   190      c = ai % b; ASSERT_ALWAYS(c == 0);
   191    }
   192  
   193    // operator&
   194    // operator|
   195    // operator^
   196  
   197    // operator<<
   198    {
   199      mpz_class a(3);
   200      unsigned int b = 4;
   201      mpz_class c;
   202      c = a << b; ASSERT_ALWAYS(c == 48);
   203    }
   204  
   205    // operator>>
   206    {
   207      mpz_class a(127);
   208      unsigned int b = 4;
   209      mpz_class c;
   210      c = a >> b; ASSERT_ALWAYS(c == 7);
   211    }
   212  
   213    // operator==
   214    // operator!=
   215    // operator<
   216    // operator<=
   217    // operator>
   218    // operator>=
   219  
   220    // cmp
   221    {
   222      mpz_class a(123), b(45);
   223      int c;
   224      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   225      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   226    }
   227    {
   228      mpz_class a(123);
   229      unsigned long b = 45;
   230      int c;
   231      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   232      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   233    }
   234    {
   235      mpz_class a(123);
   236      long b = 45;
   237      int c;
   238      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   239      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   240    }
   241    {
   242      mpz_class a(123);
   243      double b = 45;
   244      int c;
   245      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   246      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   247    }
   248  
   249  
   250    // ternary operators
   251  
   252    // mpz_addmul
   253    {
   254      mpz_class a(1), b(2), c(3);
   255      mpz_class d;
   256      d = a + b * c; ASSERT_ALWAYS(d == 7);
   257    }
   258    {
   259      mpz_class a(1), b(2);
   260      unsigned int c = 3;
   261      mpz_class d;
   262      d = a + b * c; ASSERT_ALWAYS(d == 7);
   263    }
   264    {
   265      mpz_class a(1), b(3);
   266      unsigned int c = 2;
   267      mpz_class d;
   268      d = a + c * b; ASSERT_ALWAYS(d == 7);
   269    }
   270    {
   271      mpz_class a(1), b(2);
   272      signed int c = 3;
   273      mpz_class d;
   274      d = a + b * c; ASSERT_ALWAYS(d == 7);
   275    }
   276    {
   277      mpz_class a(1), b(3);
   278      signed int c = 2;
   279      mpz_class d;
   280      d = a + c * b; ASSERT_ALWAYS(d == 7);
   281    }
   282    {
   283      mpz_class a(1), b(2);
   284      double c = 3.0;
   285      mpz_class d;
   286      d = a + b * c; ASSERT_ALWAYS(d == 7);
   287    }
   288    {
   289      mpz_class a(1), b(3);
   290      double c = 2.0;
   291      mpz_class d;
   292      d = a + c * b; ASSERT_ALWAYS(d == 7);
   293    }
   294  
   295    {
   296      mpz_class a(2), b(3), c(4);
   297      mpz_class d;
   298      d = a * b + c; ASSERT_ALWAYS(d == 10);
   299    }
   300    {
   301      mpz_class a(2), b(4);
   302      unsigned int c = 3;
   303      mpz_class d;
   304      d = a * c + b; ASSERT_ALWAYS(d == 10);
   305    }
   306    {
   307      mpz_class a(3), b(4);
   308      unsigned int c = 2;
   309      mpz_class d;
   310      d = c * a + b; ASSERT_ALWAYS(d == 10);
   311    }
   312    {
   313      mpz_class a(2), b(4);
   314      signed int c = 3;
   315      mpz_class d;
   316      d = a * c + b; ASSERT_ALWAYS(d == 10);
   317    }
   318    {
   319      mpz_class a(3), b(4);
   320      signed int c = 2;
   321      mpz_class d;
   322      d = c * a + b; ASSERT_ALWAYS(d == 10);
   323    }
   324    {
   325      mpz_class a(2), b(4);
   326      double c = 3.0;
   327      mpz_class d;
   328      d = a * c + b; ASSERT_ALWAYS(d == 10);
   329    }
   330    {
   331      mpz_class a(3), b(4);
   332      double c = 2.0;
   333      mpz_class d;
   334      d = c * a + b; ASSERT_ALWAYS(d == 10);
   335    }
   336  
   337    // mpz_submul
   338    {
   339      mpz_class a(1), b(2), c(3);
   340      mpz_class d;
   341      d = a - b * c; ASSERT_ALWAYS(d == -5);
   342    }
   343    {
   344      mpz_class a(1), b(2);
   345      unsigned int c = 3;
   346      mpz_class d;
   347      d = a - b * c; ASSERT_ALWAYS(d == -5);
   348    }
   349    {
   350      mpz_class a(1), b(3);
   351      unsigned int c = 2;
   352      mpz_class d;
   353      d = a - c * b; ASSERT_ALWAYS(d == -5);
   354    }
   355    {
   356      mpz_class a(1), b(2);
   357      signed int c = 3;
   358      mpz_class d;
   359      d = a - b * c; ASSERT_ALWAYS(d == -5);
   360    }
   361    {
   362      mpz_class a(1), b(3);
   363      signed int c = 2;
   364      mpz_class d;
   365      d = a - c * b; ASSERT_ALWAYS(d == -5);
   366    }
   367    {
   368      mpz_class a(1), b(2);
   369      double c = 3.0;
   370      mpz_class d;
   371      d = a - b * c; ASSERT_ALWAYS(d == -5);
   372    }
   373    {
   374      mpz_class a(1), b(3);
   375      double c = 2.0;
   376      mpz_class d;
   377      d = a - c * b; ASSERT_ALWAYS(d == -5);
   378    }
   379  
   380    {
   381      mpz_class a(2), b(3), c(4);
   382      mpz_class d;
   383      d = a * b - c; ASSERT_ALWAYS(d == 2);
   384    }
   385    {
   386      mpz_class a(2), b(4);
   387      unsigned int c = 3;
   388      mpz_class d;
   389      d = a * c - b; ASSERT_ALWAYS(d == 2);
   390    }
   391    {
   392      mpz_class a(3), b(4);
   393      unsigned int c = 2;
   394      mpz_class d;
   395      d = c * a - b; ASSERT_ALWAYS(d == 2);
   396    }
   397    {
   398      mpz_class a(2), b(4);
   399      signed int c = 3;
   400      mpz_class d;
   401      d = a * c - b; ASSERT_ALWAYS(d == 2);
   402    }
   403    {
   404      mpz_class a(3), b(4);
   405      signed int c = 2;
   406      mpz_class d;
   407      d = c * a - b; ASSERT_ALWAYS(d == 2);
   408    }
   409    {
   410      mpz_class a(2), b(4);
   411      double c = 3.0;
   412      mpz_class d;
   413      d = a * c - b; ASSERT_ALWAYS(d == 2);
   414    }
   415    {
   416      mpz_class a(3), b(4);
   417      double c = 2.0;
   418      mpz_class d;
   419      d = c * a - b; ASSERT_ALWAYS(d == 2);
   420    }
   421  }
   422  
   423  void
   424  check_mpq (void)
   425  {
   426    // unary operators and functions
   427  
   428    // operator+
   429    {
   430      mpq_class a(1, 2);
   431      mpq_class b;
   432      b = +a; ASSERT_ALWAYS(b == 0.5);
   433    }
   434  
   435    // operator-
   436    {
   437      mpq_class a(3, 4);
   438      mpq_class b;
   439      b = -a; ASSERT_ALWAYS(b == -0.75);
   440    }
   441  
   442    // abs
   443    {
   444      mpq_class a(-123);
   445      mpq_class b;
   446      b = abs(a); ASSERT_ALWAYS(b == 123);
   447    }
   448  
   449    // sgn
   450    {
   451      mpq_class a(123);
   452      int b = sgn(a); ASSERT_ALWAYS(b == 1);
   453    }
   454    {
   455      mpq_class a(0);
   456      int b = sgn(a); ASSERT_ALWAYS(b == 0);
   457    }
   458    {
   459      mpq_class a(-123);
   460      int b = sgn(a); ASSERT_ALWAYS(b == -1);
   461    }
   462  
   463  
   464    // binary operators and functions
   465  
   466    // operator+
   467    {
   468      mpq_class a(1, 2), b(3, 4);
   469      mpq_class c;
   470      c = a + b; ASSERT_ALWAYS(c == 1.25);
   471    }
   472    {
   473      mpq_class a(1, 2);
   474      signed int b = 2;
   475      mpq_class c;
   476      c = a + b; ASSERT_ALWAYS(c == 2.5);
   477    }
   478    {
   479      mpq_class a(1, 2);
   480      double b = 1.5;
   481      mpq_class c;
   482      c = b + a; ASSERT_ALWAYS(c == 2);
   483    }
   484  
   485    // operator-
   486    {
   487      mpq_class a(1, 2), b(3, 4);
   488      mpq_class c;
   489      c = a - b; ASSERT_ALWAYS(c == -0.25);
   490    }
   491  
   492    // operator*
   493    {
   494      mpq_class a(1, 3), b(3, 4);
   495      mpq_class c;
   496      c = a * b; ASSERT_ALWAYS(c == 0.25);
   497      c = b * b; ASSERT_ALWAYS(c == 0.5625);
   498    }
   499  
   500    // operator/
   501    {
   502      mpq_class a(1, 2), b(2, 3);
   503      mpq_class c;
   504      c = a / b; ASSERT_ALWAYS(c == 0.75);
   505    }
   506  
   507    // operator<<
   508    // operator>>
   509    // operator==
   510    // operator!=
   511    // operator<
   512    // operator<=
   513    // operator>
   514    // operator>=
   515  
   516    // cmp
   517    {
   518      mpq_class a(123), b(45);
   519      int c;
   520      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   521      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   522    }
   523    {
   524      mpq_class a(123);
   525      unsigned long b = 45;
   526      int c;
   527      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   528      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   529    }
   530    {
   531      mpq_class a(123);
   532      long b = 45;
   533      int c;
   534      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   535      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   536    }
   537    {
   538      mpq_class a(123);
   539      double b = 45;
   540      int c;
   541      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   542      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   543    }
   544    {
   545      mpq_class a(123);
   546      mpz_class b(45);
   547      int c;
   548      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   549      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   550    }
   551  }
   552  
   553  void
   554  check_mpf (void)
   555  {
   556    // unary operators and functions
   557  
   558    // operator+
   559    {
   560      mpf_class a(1);
   561      mpf_class b;
   562      b = +a; ASSERT_ALWAYS(b == 1);
   563    }
   564  
   565    // operator-
   566    {
   567      mpf_class a(2);
   568      mpf_class b;
   569      b = -a; ASSERT_ALWAYS(b == -2);
   570    }
   571  
   572    // abs
   573    {
   574      mpf_class a(-123);
   575      mpf_class b;
   576      b = abs(a); ASSERT_ALWAYS(b == 123);
   577    }
   578  
   579    // trunc
   580    {
   581      mpf_class a(1.5);
   582      mpf_class b;
   583      b = trunc(a); ASSERT_ALWAYS(b == 1);
   584    }
   585    {
   586      mpf_class a(-1.5);
   587      mpf_class b;
   588      b = trunc(a); ASSERT_ALWAYS(b == -1);
   589    }
   590  
   591    // floor
   592    {
   593      mpf_class a(1.9);
   594      mpf_class b;
   595      b = floor(a); ASSERT_ALWAYS(b == 1);
   596    }
   597    {
   598      mpf_class a(-1.1);
   599      mpf_class b;
   600      b = floor(a); ASSERT_ALWAYS(b == -2);
   601    }
   602  
   603    // ceil
   604    {
   605      mpf_class a(1.1);
   606      mpf_class b;
   607      b = ceil(a); ASSERT_ALWAYS(b == 2);
   608    }
   609    {
   610      mpf_class a(-1.9);
   611      mpf_class b;
   612      b = ceil(a); ASSERT_ALWAYS(b == -1);
   613    }
   614  
   615    // sqrt
   616    {
   617      mpf_class a(25);
   618      mpf_class b;
   619      b = sqrt(a); ASSERT_ALWAYS(b == 5);
   620    }
   621    {
   622      mpf_class a(2.25);
   623      mpf_class b;
   624      b = sqrt(a); ASSERT_ALWAYS(b == 1.5);
   625    }
   626  
   627    // sgn
   628    {
   629      mpf_class a(123);
   630      int b = sgn(a); ASSERT_ALWAYS(b == 1);
   631    }
   632    {
   633      mpf_class a(0);
   634      int b = sgn(a); ASSERT_ALWAYS(b == 0);
   635    }
   636    {
   637      mpf_class a(-123);
   638      int b = sgn(a); ASSERT_ALWAYS(b == -1);
   639    }
   640  
   641  
   642    // binary operators and functions
   643  
   644    // operator+
   645    {
   646      mpf_class a(1), b(2);
   647      mpf_class c;
   648      c = a + b; ASSERT_ALWAYS(c == 3);
   649    }
   650  
   651    // operator-
   652    {
   653      mpf_class a(3), b(4);
   654      mpf_class c;
   655      c = a - b; ASSERT_ALWAYS(c == -1);
   656    }
   657  
   658    // operator*
   659    {
   660      mpf_class a(2), b(5);
   661      mpf_class c;
   662      c = a * b; ASSERT_ALWAYS(c == 10);
   663    }
   664  
   665    // operator/
   666    {
   667      mpf_class a(7), b(4);
   668      mpf_class c;
   669      c = a / b; ASSERT_ALWAYS(c == 1.75);
   670    }
   671  
   672    // operator<<
   673    // operator>>
   674    // operator==
   675    // operator!=
   676    // operator<
   677    // operator<=
   678    // operator>
   679    // operator>=
   680  
   681    // hypot
   682    {
   683      mpf_class a(3), b(4);
   684      mpf_class c;
   685      c = hypot(a, b); ASSERT_ALWAYS(c == 5);
   686    }
   687  
   688    // cmp
   689    {
   690      mpf_class a(123), b(45);
   691      int c;
   692      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   693      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   694    }
   695    {
   696      mpf_class a(123);
   697      unsigned long b = 45;
   698      int c;
   699      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   700      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   701    }
   702    {
   703      mpf_class a(123);
   704      long b = 45;
   705      int c;
   706      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   707      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   708    }
   709    {
   710      mpf_class a(123);
   711      double b = 45;
   712      int c;
   713      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   714      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   715    }
   716    {
   717      mpf_class a(123);
   718      mpz_class b(45);
   719      int c;
   720      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   721      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   722    }
   723    {
   724      mpf_class a(123);
   725      mpq_class b(45);
   726      int c;
   727      c = cmp(a, b); ASSERT_ALWAYS(c > 0);
   728      c = cmp(b, a); ASSERT_ALWAYS(c < 0);
   729    }
   730  }
   731  
   732  
   733  int
   734  main (void)
   735  {
   736    tests_start();
   737  
   738    check_mpz();
   739    check_mpq();
   740    check_mpf();
   741  
   742    tests_end();
   743    return 0;
   744  }