xref: /netbsd/external/lgpl3/gmp/dist/tests/cxx/t-ops.cc (revision 671ea119)
14a1767b4Smrg /* Test mp*_class operators and functions.
24a1767b4Smrg 
3f81b1c5bSmrg Copyright 2001-2003, 2015 Free Software Foundation, Inc.
44a1767b4Smrg 
5d25e02daSmrg This file is part of the GNU MP Library test suite.
64a1767b4Smrg 
7d25e02daSmrg The GNU MP Library test suite is free software; you can redistribute it
8d25e02daSmrg and/or modify it under the terms of the GNU General Public License as
9d25e02daSmrg published by the Free Software Foundation; either version 3 of the License,
10d25e02daSmrg or (at your option) any later version.
114a1767b4Smrg 
12d25e02daSmrg The GNU MP Library test suite is distributed in the hope that it will be
13d25e02daSmrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14d25e02daSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15d25e02daSmrg Public License for more details.
164a1767b4Smrg 
17d25e02daSmrg You should have received a copy of the GNU General Public License along with
18f81b1c5bSmrg the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
194a1767b4Smrg 
204a1767b4Smrg #include "config.h"
214a1767b4Smrg 
224a1767b4Smrg #include <iostream>
234a1767b4Smrg 
244a1767b4Smrg #include "gmpxx.h"
254a1767b4Smrg #include "gmp-impl.h"
264a1767b4Smrg #include "tests.h"
274a1767b4Smrg 
284a1767b4Smrg using namespace std;
294a1767b4Smrg 
304a1767b4Smrg 
314a1767b4Smrg void
check_mpz(void)324a1767b4Smrg check_mpz (void)
334a1767b4Smrg {
344a1767b4Smrg   // unary operators and functions
354a1767b4Smrg 
364a1767b4Smrg   // operator+
374a1767b4Smrg   {
384a1767b4Smrg     mpz_class a(1);
394a1767b4Smrg     mpz_class b;
404a1767b4Smrg     b = +a; ASSERT_ALWAYS(b == 1);
414a1767b4Smrg   }
424a1767b4Smrg 
434a1767b4Smrg   // operator-
444a1767b4Smrg   {
454a1767b4Smrg     mpz_class a(2);
464a1767b4Smrg     mpz_class b;
474a1767b4Smrg     b = -a; ASSERT_ALWAYS(b == -2);
484a1767b4Smrg   }
494a1767b4Smrg 
504a1767b4Smrg   // operator~
514a1767b4Smrg   {
524a1767b4Smrg     mpz_class a(3);
534a1767b4Smrg     mpz_class b;
544a1767b4Smrg     b = ~a; ASSERT_ALWAYS(b == -4);
554a1767b4Smrg   }
564a1767b4Smrg 
574a1767b4Smrg   // abs
584a1767b4Smrg   {
594a1767b4Smrg     mpz_class a(-123);
604a1767b4Smrg     mpz_class b;
614a1767b4Smrg     b = abs(a); ASSERT_ALWAYS(b == 123);
62d25e02daSmrg     a <<= 300;
63d25e02daSmrg     b = abs(a); ASSERT_ALWAYS(a + b == 0);
644a1767b4Smrg   }
654a1767b4Smrg 
664a1767b4Smrg   // sqrt
674a1767b4Smrg   {
684a1767b4Smrg     mpz_class a(25);
694a1767b4Smrg     mpz_class b;
704a1767b4Smrg     b = sqrt(a); ASSERT_ALWAYS(b == 5);
714a1767b4Smrg   }
724a1767b4Smrg   {
734a1767b4Smrg     mpz_class a(125);
744a1767b4Smrg     mpz_class b;
754a1767b4Smrg     b = sqrt(a); ASSERT_ALWAYS(b == 11); // round toward zero
764a1767b4Smrg   }
774a1767b4Smrg 
784a1767b4Smrg   // sgn
794a1767b4Smrg   {
804a1767b4Smrg     mpz_class a(123);
814a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == 1);
824a1767b4Smrg   }
834a1767b4Smrg   {
844a1767b4Smrg     mpz_class a(0);
854a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == 0);
864a1767b4Smrg   }
874a1767b4Smrg   {
884a1767b4Smrg     mpz_class a(-123);
894a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == -1);
904a1767b4Smrg   }
914a1767b4Smrg 
924a1767b4Smrg 
934a1767b4Smrg   // binary operators and functions
944a1767b4Smrg 
954a1767b4Smrg   // operator+
964a1767b4Smrg   {
974a1767b4Smrg     mpz_class a(1), b(2);
984a1767b4Smrg     mpz_class c;
994a1767b4Smrg     c = a + b; ASSERT_ALWAYS(c == 3);
1004a1767b4Smrg   }
1014a1767b4Smrg   {
1024a1767b4Smrg     mpz_class a(3);
1034a1767b4Smrg     signed int b = 4;
1044a1767b4Smrg     mpz_class c;
1054a1767b4Smrg     c = a + b; ASSERT_ALWAYS(c == 7);
1064a1767b4Smrg   }
1074a1767b4Smrg   {
1084a1767b4Smrg     mpz_class a(5);
1094a1767b4Smrg     double b = 6.0;
1104a1767b4Smrg     mpz_class c;
1114a1767b4Smrg     c = b + a; ASSERT_ALWAYS(c == 11);
1124a1767b4Smrg   }
1134a1767b4Smrg 
1144a1767b4Smrg   // operator-
1154a1767b4Smrg   {
1164a1767b4Smrg     mpz_class a(3), b(6);
1174a1767b4Smrg     mpz_class c;
1184a1767b4Smrg     c = a - b; ASSERT_ALWAYS(c == -3);
1194a1767b4Smrg   }
1204a1767b4Smrg 
1214a1767b4Smrg   // operator*
1224a1767b4Smrg   {
1234a1767b4Smrg     mpz_class a(-2), b(4);
1244a1767b4Smrg     mpz_class c;
1254a1767b4Smrg     c = a * b; ASSERT_ALWAYS(c == -8);
1264a1767b4Smrg   }
1274a1767b4Smrg   {
1284a1767b4Smrg     mpz_class a(2);
1294a1767b4Smrg     long b = -4;
1304a1767b4Smrg     mpz_class c;
1314a1767b4Smrg     c = a * b; ASSERT_ALWAYS(c == -8);
1324a1767b4Smrg     c = b * a; ASSERT_ALWAYS(c == -8);
1334a1767b4Smrg   }
1344a1767b4Smrg   {
1354a1767b4Smrg     mpz_class a(-2);
1364a1767b4Smrg     unsigned long b = 4;
1374a1767b4Smrg     mpz_class c;
1384a1767b4Smrg     c = a * b; ASSERT_ALWAYS(c == -8);
1394a1767b4Smrg     c = b * a; ASSERT_ALWAYS(c == -8);
1404a1767b4Smrg   }
1414a1767b4Smrg 
1424a1767b4Smrg   // operator/ and operator%
1434a1767b4Smrg   {
1444a1767b4Smrg     mpz_class a(12), b(4);
1454a1767b4Smrg     mpz_class c;
1464a1767b4Smrg     c = a / b; ASSERT_ALWAYS(c == 3);
1474a1767b4Smrg     c = a % b; ASSERT_ALWAYS(c == 0);
1484a1767b4Smrg   }
1494a1767b4Smrg   {
1504a1767b4Smrg     mpz_class a(7), b(5);
1514a1767b4Smrg     mpz_class c;
1524a1767b4Smrg     c = a / b; ASSERT_ALWAYS(c == 1);
1534a1767b4Smrg     c = a % b; ASSERT_ALWAYS(c == 2);
1544a1767b4Smrg   }
1554a1767b4Smrg   {
1564a1767b4Smrg     mpz_class a(-10);
1574a1767b4Smrg     signed int ai = -10;
1584a1767b4Smrg     mpz_class b(3);
1594a1767b4Smrg     signed int bi = 3;
1604a1767b4Smrg     mpz_class c;
1614a1767b4Smrg     c = a / b;  ASSERT_ALWAYS(c == -3);
1624a1767b4Smrg     c = a % b;  ASSERT_ALWAYS(c == -1);
1634a1767b4Smrg     c = a / bi; ASSERT_ALWAYS(c == -3);
1644a1767b4Smrg     c = a % bi; ASSERT_ALWAYS(c == -1);
1654a1767b4Smrg     c = ai / b; ASSERT_ALWAYS(c == -3);
1664a1767b4Smrg     c = ai % b; ASSERT_ALWAYS(c == -1);
1674a1767b4Smrg   }
1684a1767b4Smrg   {
1694a1767b4Smrg     mpz_class a(-10);
1704a1767b4Smrg     signed int ai = -10;
1714a1767b4Smrg     mpz_class b(-3);
1724a1767b4Smrg     signed int bi = -3;
1734a1767b4Smrg     mpz_class c;
1744a1767b4Smrg     c = a / b;  ASSERT_ALWAYS(c == 3);
1754a1767b4Smrg     c = a % b;  ASSERT_ALWAYS(c == -1);
1764a1767b4Smrg     c = a / bi; ASSERT_ALWAYS(c == 3);
1774a1767b4Smrg     c = a % bi; ASSERT_ALWAYS(c == -1);
1784a1767b4Smrg     c = ai / b; ASSERT_ALWAYS(c == 3);
1794a1767b4Smrg     c = ai % b; ASSERT_ALWAYS(c == -1);
1804a1767b4Smrg   }
1814a1767b4Smrg   {
1824a1767b4Smrg     mpz_class a (LONG_MIN);
1834a1767b4Smrg     signed long ai = LONG_MIN;
1844a1767b4Smrg     mpz_class b = - mpz_class (LONG_MIN);
1854a1767b4Smrg     mpz_class c;
1864a1767b4Smrg     c = a / b;  ASSERT_ALWAYS(c == -1);
1874a1767b4Smrg     c = a % b;  ASSERT_ALWAYS(c == 0);
1884a1767b4Smrg     c = ai / b; ASSERT_ALWAYS(c == -1);
1894a1767b4Smrg     c = ai % b; ASSERT_ALWAYS(c == 0);
1904a1767b4Smrg   }
1914a1767b4Smrg 
1924a1767b4Smrg   // operator&
1934a1767b4Smrg   // operator|
1944a1767b4Smrg   // operator^
1954a1767b4Smrg 
1964a1767b4Smrg   // operator<<
1974a1767b4Smrg   {
1984a1767b4Smrg     mpz_class a(3);
1994a1767b4Smrg     unsigned int b = 4;
2004a1767b4Smrg     mpz_class c;
2014a1767b4Smrg     c = a << b; ASSERT_ALWAYS(c == 48);
2024a1767b4Smrg   }
2034a1767b4Smrg 
2044a1767b4Smrg   // operator>>
2054a1767b4Smrg   {
2064a1767b4Smrg     mpz_class a(127);
2074a1767b4Smrg     unsigned int b = 4;
2084a1767b4Smrg     mpz_class c;
2094a1767b4Smrg     c = a >> b; ASSERT_ALWAYS(c == 7);
2104a1767b4Smrg   }
2114a1767b4Smrg 
2124a1767b4Smrg   // operator==
2134a1767b4Smrg   // operator!=
2144a1767b4Smrg   // operator<
2154a1767b4Smrg   // operator<=
2164a1767b4Smrg   // operator>
2174a1767b4Smrg   // operator>=
2184a1767b4Smrg 
2194a1767b4Smrg   // cmp
2204a1767b4Smrg   {
2214a1767b4Smrg     mpz_class a(123), b(45);
2224a1767b4Smrg     int c;
2234a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
2244a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
2254a1767b4Smrg   }
2264a1767b4Smrg   {
2274a1767b4Smrg     mpz_class a(123);
2284a1767b4Smrg     unsigned long b = 45;
2294a1767b4Smrg     int c;
2304a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
2314a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
2324a1767b4Smrg   }
2334a1767b4Smrg   {
2344a1767b4Smrg     mpz_class a(123);
2354a1767b4Smrg     long b = 45;
2364a1767b4Smrg     int c;
2374a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
2384a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
2394a1767b4Smrg   }
2404a1767b4Smrg   {
2414a1767b4Smrg     mpz_class a(123);
2424a1767b4Smrg     double b = 45;
2434a1767b4Smrg     int c;
2444a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
2454a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
2464a1767b4Smrg   }
2474a1767b4Smrg 
2484a1767b4Smrg 
2494a1767b4Smrg   // ternary operators
2504a1767b4Smrg 
2514a1767b4Smrg   // mpz_addmul
2524a1767b4Smrg   {
2534a1767b4Smrg     mpz_class a(1), b(2), c(3);
2544a1767b4Smrg     mpz_class d;
2554a1767b4Smrg     d = a + b * c; ASSERT_ALWAYS(d == 7);
2564a1767b4Smrg   }
2574a1767b4Smrg   {
2584a1767b4Smrg     mpz_class a(1), b(2);
2594a1767b4Smrg     unsigned int c = 3;
2604a1767b4Smrg     mpz_class d;
2614a1767b4Smrg     d = a + b * c; ASSERT_ALWAYS(d == 7);
2624a1767b4Smrg   }
2634a1767b4Smrg   {
2644a1767b4Smrg     mpz_class a(1), b(3);
2654a1767b4Smrg     unsigned int c = 2;
2664a1767b4Smrg     mpz_class d;
2674a1767b4Smrg     d = a + c * b; ASSERT_ALWAYS(d == 7);
2684a1767b4Smrg   }
2694a1767b4Smrg   {
2704a1767b4Smrg     mpz_class a(1), b(2);
2714a1767b4Smrg     signed int c = 3;
2724a1767b4Smrg     mpz_class d;
2734a1767b4Smrg     d = a + b * c; ASSERT_ALWAYS(d == 7);
2744a1767b4Smrg   }
2754a1767b4Smrg   {
2764a1767b4Smrg     mpz_class a(1), b(3);
2774a1767b4Smrg     signed int c = 2;
2784a1767b4Smrg     mpz_class d;
2794a1767b4Smrg     d = a + c * b; ASSERT_ALWAYS(d == 7);
2804a1767b4Smrg   }
2814a1767b4Smrg   {
2824a1767b4Smrg     mpz_class a(1), b(2);
2834a1767b4Smrg     double c = 3.0;
2844a1767b4Smrg     mpz_class d;
2854a1767b4Smrg     d = a + b * c; ASSERT_ALWAYS(d == 7);
2864a1767b4Smrg   }
2874a1767b4Smrg   {
2884a1767b4Smrg     mpz_class a(1), b(3);
2894a1767b4Smrg     double c = 2.0;
2904a1767b4Smrg     mpz_class d;
2914a1767b4Smrg     d = a + c * b; ASSERT_ALWAYS(d == 7);
2924a1767b4Smrg   }
2934a1767b4Smrg 
2944a1767b4Smrg   {
2954a1767b4Smrg     mpz_class a(2), b(3), c(4);
2964a1767b4Smrg     mpz_class d;
2974a1767b4Smrg     d = a * b + c; ASSERT_ALWAYS(d == 10);
2984a1767b4Smrg   }
2994a1767b4Smrg   {
3004a1767b4Smrg     mpz_class a(2), b(4);
3014a1767b4Smrg     unsigned int c = 3;
3024a1767b4Smrg     mpz_class d;
3034a1767b4Smrg     d = a * c + b; ASSERT_ALWAYS(d == 10);
3044a1767b4Smrg   }
3054a1767b4Smrg   {
3064a1767b4Smrg     mpz_class a(3), b(4);
3074a1767b4Smrg     unsigned int c = 2;
3084a1767b4Smrg     mpz_class d;
3094a1767b4Smrg     d = c * a + b; ASSERT_ALWAYS(d == 10);
3104a1767b4Smrg   }
3114a1767b4Smrg   {
3124a1767b4Smrg     mpz_class a(2), b(4);
3134a1767b4Smrg     signed int c = 3;
3144a1767b4Smrg     mpz_class d;
3154a1767b4Smrg     d = a * c + b; ASSERT_ALWAYS(d == 10);
3164a1767b4Smrg   }
3174a1767b4Smrg   {
3184a1767b4Smrg     mpz_class a(3), b(4);
3194a1767b4Smrg     signed int c = 2;
3204a1767b4Smrg     mpz_class d;
3214a1767b4Smrg     d = c * a + b; ASSERT_ALWAYS(d == 10);
3224a1767b4Smrg   }
3234a1767b4Smrg   {
3244a1767b4Smrg     mpz_class a(2), b(4);
3254a1767b4Smrg     double c = 3.0;
3264a1767b4Smrg     mpz_class d;
3274a1767b4Smrg     d = a * c + b; ASSERT_ALWAYS(d == 10);
3284a1767b4Smrg   }
3294a1767b4Smrg   {
3304a1767b4Smrg     mpz_class a(3), b(4);
3314a1767b4Smrg     double c = 2.0;
3324a1767b4Smrg     mpz_class d;
3334a1767b4Smrg     d = c * a + b; ASSERT_ALWAYS(d == 10);
3344a1767b4Smrg   }
3354a1767b4Smrg 
3364a1767b4Smrg   // mpz_submul
3374a1767b4Smrg   {
3384a1767b4Smrg     mpz_class a(1), b(2), c(3);
3394a1767b4Smrg     mpz_class d;
3404a1767b4Smrg     d = a - b * c; ASSERT_ALWAYS(d == -5);
3414a1767b4Smrg   }
3424a1767b4Smrg   {
3434a1767b4Smrg     mpz_class a(1), b(2);
3444a1767b4Smrg     unsigned int c = 3;
3454a1767b4Smrg     mpz_class d;
3464a1767b4Smrg     d = a - b * c; ASSERT_ALWAYS(d == -5);
3474a1767b4Smrg   }
3484a1767b4Smrg   {
3494a1767b4Smrg     mpz_class a(1), b(3);
3504a1767b4Smrg     unsigned int c = 2;
3514a1767b4Smrg     mpz_class d;
3524a1767b4Smrg     d = a - c * b; ASSERT_ALWAYS(d == -5);
3534a1767b4Smrg   }
3544a1767b4Smrg   {
3554a1767b4Smrg     mpz_class a(1), b(2);
3564a1767b4Smrg     signed int c = 3;
3574a1767b4Smrg     mpz_class d;
3584a1767b4Smrg     d = a - b * c; ASSERT_ALWAYS(d == -5);
3594a1767b4Smrg   }
3604a1767b4Smrg   {
3614a1767b4Smrg     mpz_class a(1), b(3);
3624a1767b4Smrg     signed int c = 2;
3634a1767b4Smrg     mpz_class d;
3644a1767b4Smrg     d = a - c * b; ASSERT_ALWAYS(d == -5);
3654a1767b4Smrg   }
3664a1767b4Smrg   {
3674a1767b4Smrg     mpz_class a(1), b(2);
3684a1767b4Smrg     double c = 3.0;
3694a1767b4Smrg     mpz_class d;
3704a1767b4Smrg     d = a - b * c; ASSERT_ALWAYS(d == -5);
3714a1767b4Smrg   }
3724a1767b4Smrg   {
3734a1767b4Smrg     mpz_class a(1), b(3);
3744a1767b4Smrg     double c = 2.0;
3754a1767b4Smrg     mpz_class d;
3764a1767b4Smrg     d = a - c * b; ASSERT_ALWAYS(d == -5);
3774a1767b4Smrg   }
3784a1767b4Smrg 
3794a1767b4Smrg   {
3804a1767b4Smrg     mpz_class a(2), b(3), c(4);
3814a1767b4Smrg     mpz_class d;
3824a1767b4Smrg     d = a * b - c; ASSERT_ALWAYS(d == 2);
3834a1767b4Smrg   }
3844a1767b4Smrg   {
3854a1767b4Smrg     mpz_class a(2), b(4);
3864a1767b4Smrg     unsigned int c = 3;
3874a1767b4Smrg     mpz_class d;
3884a1767b4Smrg     d = a * c - b; ASSERT_ALWAYS(d == 2);
3894a1767b4Smrg   }
3904a1767b4Smrg   {
3914a1767b4Smrg     mpz_class a(3), b(4);
3924a1767b4Smrg     unsigned int c = 2;
3934a1767b4Smrg     mpz_class d;
3944a1767b4Smrg     d = c * a - b; ASSERT_ALWAYS(d == 2);
3954a1767b4Smrg   }
3964a1767b4Smrg   {
3974a1767b4Smrg     mpz_class a(2), b(4);
3984a1767b4Smrg     signed int c = 3;
3994a1767b4Smrg     mpz_class d;
4004a1767b4Smrg     d = a * c - b; ASSERT_ALWAYS(d == 2);
4014a1767b4Smrg   }
4024a1767b4Smrg   {
4034a1767b4Smrg     mpz_class a(3), b(4);
4044a1767b4Smrg     signed int c = 2;
4054a1767b4Smrg     mpz_class d;
4064a1767b4Smrg     d = c * a - b; ASSERT_ALWAYS(d == 2);
4074a1767b4Smrg   }
4084a1767b4Smrg   {
4094a1767b4Smrg     mpz_class a(2), b(4);
4104a1767b4Smrg     double c = 3.0;
4114a1767b4Smrg     mpz_class d;
4124a1767b4Smrg     d = a * c - b; ASSERT_ALWAYS(d == 2);
4134a1767b4Smrg   }
4144a1767b4Smrg   {
4154a1767b4Smrg     mpz_class a(3), b(4);
4164a1767b4Smrg     double c = 2.0;
4174a1767b4Smrg     mpz_class d;
4184a1767b4Smrg     d = c * a - b; ASSERT_ALWAYS(d == 2);
4194a1767b4Smrg   }
4204a1767b4Smrg }
4214a1767b4Smrg 
4224a1767b4Smrg void
check_mpq(void)4234a1767b4Smrg check_mpq (void)
4244a1767b4Smrg {
4254a1767b4Smrg   // unary operators and functions
4264a1767b4Smrg 
4274a1767b4Smrg   // operator+
4284a1767b4Smrg   {
4294a1767b4Smrg     mpq_class a(1, 2);
4304a1767b4Smrg     mpq_class b;
4314a1767b4Smrg     b = +a; ASSERT_ALWAYS(b == 0.5);
4324a1767b4Smrg   }
4334a1767b4Smrg 
4344a1767b4Smrg   // operator-
4354a1767b4Smrg   {
4364a1767b4Smrg     mpq_class a(3, 4);
4374a1767b4Smrg     mpq_class b;
4384a1767b4Smrg     b = -a; ASSERT_ALWAYS(b == -0.75);
4394a1767b4Smrg   }
4404a1767b4Smrg 
4414a1767b4Smrg   // abs
4424a1767b4Smrg   {
4434a1767b4Smrg     mpq_class a(-123);
4444a1767b4Smrg     mpq_class b;
4454a1767b4Smrg     b = abs(a); ASSERT_ALWAYS(b == 123);
4464a1767b4Smrg   }
4474a1767b4Smrg 
4484a1767b4Smrg   // sgn
4494a1767b4Smrg   {
4504a1767b4Smrg     mpq_class a(123);
4514a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == 1);
4524a1767b4Smrg   }
4534a1767b4Smrg   {
4544a1767b4Smrg     mpq_class a(0);
4554a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == 0);
4564a1767b4Smrg   }
4574a1767b4Smrg   {
4584a1767b4Smrg     mpq_class a(-123);
4594a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == -1);
4604a1767b4Smrg   }
4614a1767b4Smrg 
4624a1767b4Smrg 
4634a1767b4Smrg   // binary operators and functions
4644a1767b4Smrg 
4654a1767b4Smrg   // operator+
4664a1767b4Smrg   {
4674a1767b4Smrg     mpq_class a(1, 2), b(3, 4);
4684a1767b4Smrg     mpq_class c;
4694a1767b4Smrg     c = a + b; ASSERT_ALWAYS(c == 1.25);
4704a1767b4Smrg   }
4714a1767b4Smrg   {
4724a1767b4Smrg     mpq_class a(1, 2);
4734a1767b4Smrg     signed int b = 2;
4744a1767b4Smrg     mpq_class c;
4754a1767b4Smrg     c = a + b; ASSERT_ALWAYS(c == 2.5);
4764a1767b4Smrg   }
4774a1767b4Smrg   {
4784a1767b4Smrg     mpq_class a(1, 2);
4794a1767b4Smrg     double b = 1.5;
4804a1767b4Smrg     mpq_class c;
4814a1767b4Smrg     c = b + a; ASSERT_ALWAYS(c == 2);
4824a1767b4Smrg   }
4834a1767b4Smrg 
4844a1767b4Smrg   // operator-
4854a1767b4Smrg   {
4864a1767b4Smrg     mpq_class a(1, 2), b(3, 4);
4874a1767b4Smrg     mpq_class c;
4884a1767b4Smrg     c = a - b; ASSERT_ALWAYS(c == -0.25);
4894a1767b4Smrg   }
4904a1767b4Smrg 
4914a1767b4Smrg   // operator*
4924a1767b4Smrg   {
4934a1767b4Smrg     mpq_class a(1, 3), b(3, 4);
4944a1767b4Smrg     mpq_class c;
4954a1767b4Smrg     c = a * b; ASSERT_ALWAYS(c == 0.25);
496d25e02daSmrg     c = b * b; ASSERT_ALWAYS(c == 0.5625);
4974a1767b4Smrg   }
4984a1767b4Smrg 
4994a1767b4Smrg   // operator/
5004a1767b4Smrg   {
5014a1767b4Smrg     mpq_class a(1, 2), b(2, 3);
5024a1767b4Smrg     mpq_class c;
5034a1767b4Smrg     c = a / b; ASSERT_ALWAYS(c == 0.75);
5044a1767b4Smrg   }
505*671ea119Smrg   {
506*671ea119Smrg     mpq_class one = 1;
507*671ea119Smrg     mpq_class x(2, 5);
508*671ea119Smrg     ASSERT_ALWAYS(1 / x == one / x);
509*671ea119Smrg     ASSERT_ALWAYS(1u / x == one / x);
510*671ea119Smrg     x = (-1) / x;
511*671ea119Smrg     ASSERT_ALWAYS(x == -2.5);
512*671ea119Smrg     ASSERT_ALWAYS(0 / x == 0);
513*671ea119Smrg     ASSERT_ALWAYS(0u / x == 0);
514*671ea119Smrg   }
5154a1767b4Smrg 
5164a1767b4Smrg   // operator<<
5174a1767b4Smrg   // operator>>
5184a1767b4Smrg   // operator==
5194a1767b4Smrg   // operator!=
5204a1767b4Smrg   // operator<
5214a1767b4Smrg   // operator<=
5224a1767b4Smrg   // operator>
5234a1767b4Smrg   // operator>=
5244a1767b4Smrg 
5254a1767b4Smrg   // cmp
5264a1767b4Smrg   {
5274a1767b4Smrg     mpq_class a(123), b(45);
5284a1767b4Smrg     int c;
5294a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
5304a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
5314a1767b4Smrg   }
5324a1767b4Smrg   {
5334a1767b4Smrg     mpq_class a(123);
5344a1767b4Smrg     unsigned long b = 45;
5354a1767b4Smrg     int c;
5364a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
5374a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
5384a1767b4Smrg   }
5394a1767b4Smrg   {
5404a1767b4Smrg     mpq_class a(123);
5414a1767b4Smrg     long b = 45;
5424a1767b4Smrg     int c;
5434a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
5444a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
5454a1767b4Smrg   }
5464a1767b4Smrg   {
5474a1767b4Smrg     mpq_class a(123);
5484a1767b4Smrg     double b = 45;
5494a1767b4Smrg     int c;
5504a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
5514a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
5524a1767b4Smrg   }
553f81b1c5bSmrg   {
554f81b1c5bSmrg     mpq_class a(123);
555f81b1c5bSmrg     mpz_class b(45);
556f81b1c5bSmrg     int c;
557f81b1c5bSmrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
558f81b1c5bSmrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
559f81b1c5bSmrg   }
5604a1767b4Smrg }
5614a1767b4Smrg 
5624a1767b4Smrg void
check_mpf(void)5634a1767b4Smrg check_mpf (void)
5644a1767b4Smrg {
5654a1767b4Smrg   // unary operators and functions
5664a1767b4Smrg 
5674a1767b4Smrg   // operator+
5684a1767b4Smrg   {
5694a1767b4Smrg     mpf_class a(1);
5704a1767b4Smrg     mpf_class b;
5714a1767b4Smrg     b = +a; ASSERT_ALWAYS(b == 1);
5724a1767b4Smrg   }
5734a1767b4Smrg 
5744a1767b4Smrg   // operator-
5754a1767b4Smrg   {
5764a1767b4Smrg     mpf_class a(2);
5774a1767b4Smrg     mpf_class b;
5784a1767b4Smrg     b = -a; ASSERT_ALWAYS(b == -2);
5794a1767b4Smrg   }
5804a1767b4Smrg 
5814a1767b4Smrg   // abs
5824a1767b4Smrg   {
5834a1767b4Smrg     mpf_class a(-123);
5844a1767b4Smrg     mpf_class b;
5854a1767b4Smrg     b = abs(a); ASSERT_ALWAYS(b == 123);
5864a1767b4Smrg   }
5874a1767b4Smrg 
5884a1767b4Smrg   // trunc
5894a1767b4Smrg   {
5904a1767b4Smrg     mpf_class a(1.5);
5914a1767b4Smrg     mpf_class b;
5924a1767b4Smrg     b = trunc(a); ASSERT_ALWAYS(b == 1);
5934a1767b4Smrg   }
5944a1767b4Smrg   {
5954a1767b4Smrg     mpf_class a(-1.5);
5964a1767b4Smrg     mpf_class b;
5974a1767b4Smrg     b = trunc(a); ASSERT_ALWAYS(b == -1);
5984a1767b4Smrg   }
5994a1767b4Smrg 
6004a1767b4Smrg   // floor
6014a1767b4Smrg   {
6024a1767b4Smrg     mpf_class a(1.9);
6034a1767b4Smrg     mpf_class b;
6044a1767b4Smrg     b = floor(a); ASSERT_ALWAYS(b == 1);
6054a1767b4Smrg   }
6064a1767b4Smrg   {
6074a1767b4Smrg     mpf_class a(-1.1);
6084a1767b4Smrg     mpf_class b;
6094a1767b4Smrg     b = floor(a); ASSERT_ALWAYS(b == -2);
6104a1767b4Smrg   }
6114a1767b4Smrg 
6124a1767b4Smrg   // ceil
6134a1767b4Smrg   {
6144a1767b4Smrg     mpf_class a(1.1);
6154a1767b4Smrg     mpf_class b;
6164a1767b4Smrg     b = ceil(a); ASSERT_ALWAYS(b == 2);
6174a1767b4Smrg   }
6184a1767b4Smrg   {
6194a1767b4Smrg     mpf_class a(-1.9);
6204a1767b4Smrg     mpf_class b;
6214a1767b4Smrg     b = ceil(a); ASSERT_ALWAYS(b == -1);
6224a1767b4Smrg   }
6234a1767b4Smrg 
6244a1767b4Smrg   // sqrt
6254a1767b4Smrg   {
6264a1767b4Smrg     mpf_class a(25);
6274a1767b4Smrg     mpf_class b;
6284a1767b4Smrg     b = sqrt(a); ASSERT_ALWAYS(b == 5);
6294a1767b4Smrg   }
6304a1767b4Smrg   {
6314a1767b4Smrg     mpf_class a(2.25);
6324a1767b4Smrg     mpf_class b;
6334a1767b4Smrg     b = sqrt(a); ASSERT_ALWAYS(b == 1.5);
6344a1767b4Smrg   }
6354a1767b4Smrg 
6364a1767b4Smrg   // sgn
6374a1767b4Smrg   {
6384a1767b4Smrg     mpf_class a(123);
6394a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == 1);
6404a1767b4Smrg   }
6414a1767b4Smrg   {
6424a1767b4Smrg     mpf_class a(0);
6434a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == 0);
6444a1767b4Smrg   }
6454a1767b4Smrg   {
6464a1767b4Smrg     mpf_class a(-123);
6474a1767b4Smrg     int b = sgn(a); ASSERT_ALWAYS(b == -1);
6484a1767b4Smrg   }
6494a1767b4Smrg 
6504a1767b4Smrg 
6514a1767b4Smrg   // binary operators and functions
6524a1767b4Smrg 
6534a1767b4Smrg   // operator+
6544a1767b4Smrg   {
6554a1767b4Smrg     mpf_class a(1), b(2);
6564a1767b4Smrg     mpf_class c;
6574a1767b4Smrg     c = a + b; ASSERT_ALWAYS(c == 3);
6584a1767b4Smrg   }
6594a1767b4Smrg 
6604a1767b4Smrg   // operator-
6614a1767b4Smrg   {
6624a1767b4Smrg     mpf_class a(3), b(4);
6634a1767b4Smrg     mpf_class c;
6644a1767b4Smrg     c = a - b; ASSERT_ALWAYS(c == -1);
6654a1767b4Smrg   }
6664a1767b4Smrg 
6674a1767b4Smrg   // operator*
6684a1767b4Smrg   {
6694a1767b4Smrg     mpf_class a(2), b(5);
6704a1767b4Smrg     mpf_class c;
6714a1767b4Smrg     c = a * b; ASSERT_ALWAYS(c == 10);
6724a1767b4Smrg   }
6734a1767b4Smrg 
6744a1767b4Smrg   // operator/
6754a1767b4Smrg   {
6764a1767b4Smrg     mpf_class a(7), b(4);
6774a1767b4Smrg     mpf_class c;
6784a1767b4Smrg     c = a / b; ASSERT_ALWAYS(c == 1.75);
6794a1767b4Smrg   }
6804a1767b4Smrg 
6814a1767b4Smrg   // operator<<
6824a1767b4Smrg   // operator>>
6834a1767b4Smrg   // operator==
6844a1767b4Smrg   // operator!=
6854a1767b4Smrg   // operator<
6864a1767b4Smrg   // operator<=
6874a1767b4Smrg   // operator>
6884a1767b4Smrg   // operator>=
6894a1767b4Smrg 
6904a1767b4Smrg   // hypot
6914a1767b4Smrg   {
6924a1767b4Smrg     mpf_class a(3), b(4);
6934a1767b4Smrg     mpf_class c;
6944a1767b4Smrg     c = hypot(a, b); ASSERT_ALWAYS(c == 5);
6954a1767b4Smrg   }
6964a1767b4Smrg 
6974a1767b4Smrg   // cmp
6984a1767b4Smrg   {
6994a1767b4Smrg     mpf_class a(123), b(45);
7004a1767b4Smrg     int c;
7014a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
7024a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
7034a1767b4Smrg   }
7044a1767b4Smrg   {
7054a1767b4Smrg     mpf_class a(123);
7064a1767b4Smrg     unsigned long b = 45;
7074a1767b4Smrg     int c;
7084a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
7094a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
7104a1767b4Smrg   }
7114a1767b4Smrg   {
7124a1767b4Smrg     mpf_class a(123);
7134a1767b4Smrg     long b = 45;
7144a1767b4Smrg     int c;
7154a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
7164a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
7174a1767b4Smrg   }
7184a1767b4Smrg   {
7194a1767b4Smrg     mpf_class a(123);
7204a1767b4Smrg     double b = 45;
7214a1767b4Smrg     int c;
7224a1767b4Smrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
7234a1767b4Smrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
7244a1767b4Smrg   }
725f81b1c5bSmrg   {
726f81b1c5bSmrg     mpf_class a(123);
727f81b1c5bSmrg     mpz_class b(45);
728f81b1c5bSmrg     int c;
729f81b1c5bSmrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
730f81b1c5bSmrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
731f81b1c5bSmrg   }
732f81b1c5bSmrg   {
733f81b1c5bSmrg     mpf_class a(123);
734f81b1c5bSmrg     mpq_class b(45);
735f81b1c5bSmrg     int c;
736f81b1c5bSmrg     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
737f81b1c5bSmrg     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
738f81b1c5bSmrg   }
7394a1767b4Smrg }
7404a1767b4Smrg 
7414a1767b4Smrg 
7424a1767b4Smrg int
main(void)7434a1767b4Smrg main (void)
7444a1767b4Smrg {
7454a1767b4Smrg   tests_start();
7464a1767b4Smrg 
7474a1767b4Smrg   check_mpz();
7484a1767b4Smrg   check_mpq();
7494a1767b4Smrg   check_mpf();
7504a1767b4Smrg 
7514a1767b4Smrg   tests_end();
7524a1767b4Smrg   return 0;
7534a1767b4Smrg }
754