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