| /* Test mp*_class operators and functions. |
| |
| Copyright 2001-2003, 2015 Free Software Foundation, Inc. |
| |
| This file is part of the GNU MP Library test suite. |
| |
| The GNU MP Library test suite is free software; you can redistribute it |
| and/or modify it under the terms of the GNU General Public License as |
| published by the Free Software Foundation; either version 3 of the License, |
| or (at your option) any later version. |
| |
| The GNU MP Library test suite is distributed in the hope that it will be |
| useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
| Public License for more details. |
| |
| You should have received a copy of the GNU General Public License along with |
| the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ |
| |
| #include "config.h" |
| |
| #include <iostream> |
| |
| #include "gmpxx.h" |
| #include "gmp-impl.h" |
| #include "tests.h" |
| |
| using namespace std; |
| |
| |
| void |
| check_mpz (void) |
| { |
| // unary operators and functions |
| |
| // operator+ |
| { |
| mpz_class a(1); |
| mpz_class b; |
| b = +a; ASSERT_ALWAYS(b == 1); |
| } |
| |
| // operator- |
| { |
| mpz_class a(2); |
| mpz_class b; |
| b = -a; ASSERT_ALWAYS(b == -2); |
| } |
| |
| // operator~ |
| { |
| mpz_class a(3); |
| mpz_class b; |
| b = ~a; ASSERT_ALWAYS(b == -4); |
| } |
| |
| // abs |
| { |
| mpz_class a(-123); |
| mpz_class b; |
| b = abs(a); ASSERT_ALWAYS(b == 123); |
| a <<= 300; |
| b = abs(a); ASSERT_ALWAYS(a + b == 0); |
| } |
| |
| // sqrt |
| { |
| mpz_class a(25); |
| mpz_class b; |
| b = sqrt(a); ASSERT_ALWAYS(b == 5); |
| } |
| { |
| mpz_class a(125); |
| mpz_class b; |
| b = sqrt(a); ASSERT_ALWAYS(b == 11); // round toward zero |
| } |
| |
| // sgn |
| { |
| mpz_class a(123); |
| int b = sgn(a); ASSERT_ALWAYS(b == 1); |
| } |
| { |
| mpz_class a(0); |
| int b = sgn(a); ASSERT_ALWAYS(b == 0); |
| } |
| { |
| mpz_class a(-123); |
| int b = sgn(a); ASSERT_ALWAYS(b == -1); |
| } |
| |
| |
| // binary operators and functions |
| |
| // operator+ |
| { |
| mpz_class a(1), b(2); |
| mpz_class c; |
| c = a + b; ASSERT_ALWAYS(c == 3); |
| } |
| { |
| mpz_class a(3); |
| signed int b = 4; |
| mpz_class c; |
| c = a + b; ASSERT_ALWAYS(c == 7); |
| } |
| { |
| mpz_class a(5); |
| double b = 6.0; |
| mpz_class c; |
| c = b + a; ASSERT_ALWAYS(c == 11); |
| } |
| |
| // operator- |
| { |
| mpz_class a(3), b(6); |
| mpz_class c; |
| c = a - b; ASSERT_ALWAYS(c == -3); |
| } |
| |
| // operator* |
| { |
| mpz_class a(-2), b(4); |
| mpz_class c; |
| c = a * b; ASSERT_ALWAYS(c == -8); |
| } |
| { |
| mpz_class a(2); |
| long b = -4; |
| mpz_class c; |
| c = a * b; ASSERT_ALWAYS(c == -8); |
| c = b * a; ASSERT_ALWAYS(c == -8); |
| } |
| { |
| mpz_class a(-2); |
| unsigned long b = 4; |
| mpz_class c; |
| c = a * b; ASSERT_ALWAYS(c == -8); |
| c = b * a; ASSERT_ALWAYS(c == -8); |
| } |
| |
| // operator/ and operator% |
| { |
| mpz_class a(12), b(4); |
| mpz_class c; |
| c = a / b; ASSERT_ALWAYS(c == 3); |
| c = a % b; ASSERT_ALWAYS(c == 0); |
| } |
| { |
| mpz_class a(7), b(5); |
| mpz_class c; |
| c = a / b; ASSERT_ALWAYS(c == 1); |
| c = a % b; ASSERT_ALWAYS(c == 2); |
| } |
| { |
| mpz_class a(-10); |
| signed int ai = -10; |
| mpz_class b(3); |
| signed int bi = 3; |
| mpz_class c; |
| c = a / b; ASSERT_ALWAYS(c == -3); |
| c = a % b; ASSERT_ALWAYS(c == -1); |
| c = a / bi; ASSERT_ALWAYS(c == -3); |
| c = a % bi; ASSERT_ALWAYS(c == -1); |
| c = ai / b; ASSERT_ALWAYS(c == -3); |
| c = ai % b; ASSERT_ALWAYS(c == -1); |
| } |
| { |
| mpz_class a(-10); |
| signed int ai = -10; |
| mpz_class b(-3); |
| signed int bi = -3; |
| mpz_class c; |
| c = a / b; ASSERT_ALWAYS(c == 3); |
| c = a % b; ASSERT_ALWAYS(c == -1); |
| c = a / bi; ASSERT_ALWAYS(c == 3); |
| c = a % bi; ASSERT_ALWAYS(c == -1); |
| c = ai / b; ASSERT_ALWAYS(c == 3); |
| c = ai % b; ASSERT_ALWAYS(c == -1); |
| } |
| { |
| mpz_class a (LONG_MIN); |
| signed long ai = LONG_MIN; |
| mpz_class b = - mpz_class (LONG_MIN); |
| mpz_class c; |
| c = a / b; ASSERT_ALWAYS(c == -1); |
| c = a % b; ASSERT_ALWAYS(c == 0); |
| c = ai / b; ASSERT_ALWAYS(c == -1); |
| c = ai % b; ASSERT_ALWAYS(c == 0); |
| } |
| |
| // operator& |
| // operator| |
| // operator^ |
| |
| // operator<< |
| { |
| mpz_class a(3); |
| unsigned int b = 4; |
| mpz_class c; |
| c = a << b; ASSERT_ALWAYS(c == 48); |
| } |
| |
| // operator>> |
| { |
| mpz_class a(127); |
| unsigned int b = 4; |
| mpz_class c; |
| c = a >> b; ASSERT_ALWAYS(c == 7); |
| } |
| |
| // operator== |
| // operator!= |
| // operator< |
| // operator<= |
| // operator> |
| // operator>= |
| |
| // cmp |
| { |
| mpz_class a(123), b(45); |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpz_class a(123); |
| unsigned long b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpz_class a(123); |
| long b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpz_class a(123); |
| double b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| |
| |
| // ternary operators |
| |
| // mpz_addmul |
| { |
| mpz_class a(1), b(2), c(3); |
| mpz_class d; |
| d = a + b * c; ASSERT_ALWAYS(d == 7); |
| } |
| { |
| mpz_class a(1), b(2); |
| unsigned int c = 3; |
| mpz_class d; |
| d = a + b * c; ASSERT_ALWAYS(d == 7); |
| } |
| { |
| mpz_class a(1), b(3); |
| unsigned int c = 2; |
| mpz_class d; |
| d = a + c * b; ASSERT_ALWAYS(d == 7); |
| } |
| { |
| mpz_class a(1), b(2); |
| signed int c = 3; |
| mpz_class d; |
| d = a + b * c; ASSERT_ALWAYS(d == 7); |
| } |
| { |
| mpz_class a(1), b(3); |
| signed int c = 2; |
| mpz_class d; |
| d = a + c * b; ASSERT_ALWAYS(d == 7); |
| } |
| { |
| mpz_class a(1), b(2); |
| double c = 3.0; |
| mpz_class d; |
| d = a + b * c; ASSERT_ALWAYS(d == 7); |
| } |
| { |
| mpz_class a(1), b(3); |
| double c = 2.0; |
| mpz_class d; |
| d = a + c * b; ASSERT_ALWAYS(d == 7); |
| } |
| |
| { |
| mpz_class a(2), b(3), c(4); |
| mpz_class d; |
| d = a * b + c; ASSERT_ALWAYS(d == 10); |
| } |
| { |
| mpz_class a(2), b(4); |
| unsigned int c = 3; |
| mpz_class d; |
| d = a * c + b; ASSERT_ALWAYS(d == 10); |
| } |
| { |
| mpz_class a(3), b(4); |
| unsigned int c = 2; |
| mpz_class d; |
| d = c * a + b; ASSERT_ALWAYS(d == 10); |
| } |
| { |
| mpz_class a(2), b(4); |
| signed int c = 3; |
| mpz_class d; |
| d = a * c + b; ASSERT_ALWAYS(d == 10); |
| } |
| { |
| mpz_class a(3), b(4); |
| signed int c = 2; |
| mpz_class d; |
| d = c * a + b; ASSERT_ALWAYS(d == 10); |
| } |
| { |
| mpz_class a(2), b(4); |
| double c = 3.0; |
| mpz_class d; |
| d = a * c + b; ASSERT_ALWAYS(d == 10); |
| } |
| { |
| mpz_class a(3), b(4); |
| double c = 2.0; |
| mpz_class d; |
| d = c * a + b; ASSERT_ALWAYS(d == 10); |
| } |
| |
| // mpz_submul |
| { |
| mpz_class a(1), b(2), c(3); |
| mpz_class d; |
| d = a - b * c; ASSERT_ALWAYS(d == -5); |
| } |
| { |
| mpz_class a(1), b(2); |
| unsigned int c = 3; |
| mpz_class d; |
| d = a - b * c; ASSERT_ALWAYS(d == -5); |
| } |
| { |
| mpz_class a(1), b(3); |
| unsigned int c = 2; |
| mpz_class d; |
| d = a - c * b; ASSERT_ALWAYS(d == -5); |
| } |
| { |
| mpz_class a(1), b(2); |
| signed int c = 3; |
| mpz_class d; |
| d = a - b * c; ASSERT_ALWAYS(d == -5); |
| } |
| { |
| mpz_class a(1), b(3); |
| signed int c = 2; |
| mpz_class d; |
| d = a - c * b; ASSERT_ALWAYS(d == -5); |
| } |
| { |
| mpz_class a(1), b(2); |
| double c = 3.0; |
| mpz_class d; |
| d = a - b * c; ASSERT_ALWAYS(d == -5); |
| } |
| { |
| mpz_class a(1), b(3); |
| double c = 2.0; |
| mpz_class d; |
| d = a - c * b; ASSERT_ALWAYS(d == -5); |
| } |
| |
| { |
| mpz_class a(2), b(3), c(4); |
| mpz_class d; |
| d = a * b - c; ASSERT_ALWAYS(d == 2); |
| } |
| { |
| mpz_class a(2), b(4); |
| unsigned int c = 3; |
| mpz_class d; |
| d = a * c - b; ASSERT_ALWAYS(d == 2); |
| } |
| { |
| mpz_class a(3), b(4); |
| unsigned int c = 2; |
| mpz_class d; |
| d = c * a - b; ASSERT_ALWAYS(d == 2); |
| } |
| { |
| mpz_class a(2), b(4); |
| signed int c = 3; |
| mpz_class d; |
| d = a * c - b; ASSERT_ALWAYS(d == 2); |
| } |
| { |
| mpz_class a(3), b(4); |
| signed int c = 2; |
| mpz_class d; |
| d = c * a - b; ASSERT_ALWAYS(d == 2); |
| } |
| { |
| mpz_class a(2), b(4); |
| double c = 3.0; |
| mpz_class d; |
| d = a * c - b; ASSERT_ALWAYS(d == 2); |
| } |
| { |
| mpz_class a(3), b(4); |
| double c = 2.0; |
| mpz_class d; |
| d = c * a - b; ASSERT_ALWAYS(d == 2); |
| } |
| } |
| |
| void |
| check_mpq (void) |
| { |
| // unary operators and functions |
| |
| // operator+ |
| { |
| mpq_class a(1, 2); |
| mpq_class b; |
| b = +a; ASSERT_ALWAYS(b == 0.5); |
| } |
| |
| // operator- |
| { |
| mpq_class a(3, 4); |
| mpq_class b; |
| b = -a; ASSERT_ALWAYS(b == -0.75); |
| } |
| |
| // abs |
| { |
| mpq_class a(-123); |
| mpq_class b; |
| b = abs(a); ASSERT_ALWAYS(b == 123); |
| } |
| |
| // sgn |
| { |
| mpq_class a(123); |
| int b = sgn(a); ASSERT_ALWAYS(b == 1); |
| } |
| { |
| mpq_class a(0); |
| int b = sgn(a); ASSERT_ALWAYS(b == 0); |
| } |
| { |
| mpq_class a(-123); |
| int b = sgn(a); ASSERT_ALWAYS(b == -1); |
| } |
| |
| |
| // binary operators and functions |
| |
| // operator+ |
| { |
| mpq_class a(1, 2), b(3, 4); |
| mpq_class c; |
| c = a + b; ASSERT_ALWAYS(c == 1.25); |
| } |
| { |
| mpq_class a(1, 2); |
| signed int b = 2; |
| mpq_class c; |
| c = a + b; ASSERT_ALWAYS(c == 2.5); |
| } |
| { |
| mpq_class a(1, 2); |
| double b = 1.5; |
| mpq_class c; |
| c = b + a; ASSERT_ALWAYS(c == 2); |
| } |
| |
| // operator- |
| { |
| mpq_class a(1, 2), b(3, 4); |
| mpq_class c; |
| c = a - b; ASSERT_ALWAYS(c == -0.25); |
| } |
| |
| // operator* |
| { |
| mpq_class a(1, 3), b(3, 4); |
| mpq_class c; |
| c = a * b; ASSERT_ALWAYS(c == 0.25); |
| c = b * b; ASSERT_ALWAYS(c == 0.5625); |
| } |
| |
| // operator/ |
| { |
| mpq_class a(1, 2), b(2, 3); |
| mpq_class c; |
| c = a / b; ASSERT_ALWAYS(c == 0.75); |
| } |
| { |
| mpq_class one = 1; |
| mpq_class x(2, 5); |
| ASSERT_ALWAYS(1 / x == one / x); |
| ASSERT_ALWAYS(1u / x == one / x); |
| x = (-1) / x; |
| ASSERT_ALWAYS(x == -2.5); |
| ASSERT_ALWAYS(0 / x == 0); |
| ASSERT_ALWAYS(0u / x == 0); |
| } |
| |
| // operator<< |
| // operator>> |
| // operator== |
| // operator!= |
| // operator< |
| // operator<= |
| // operator> |
| // operator>= |
| |
| // cmp |
| { |
| mpq_class a(123), b(45); |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpq_class a(123); |
| unsigned long b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpq_class a(123); |
| long b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpq_class a(123); |
| double b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpq_class a(123); |
| mpz_class b(45); |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| } |
| |
| void |
| check_mpf (void) |
| { |
| // unary operators and functions |
| |
| // operator+ |
| { |
| mpf_class a(1); |
| mpf_class b; |
| b = +a; ASSERT_ALWAYS(b == 1); |
| } |
| |
| // operator- |
| { |
| mpf_class a(2); |
| mpf_class b; |
| b = -a; ASSERT_ALWAYS(b == -2); |
| } |
| |
| // abs |
| { |
| mpf_class a(-123); |
| mpf_class b; |
| b = abs(a); ASSERT_ALWAYS(b == 123); |
| } |
| |
| // trunc |
| { |
| mpf_class a(1.5); |
| mpf_class b; |
| b = trunc(a); ASSERT_ALWAYS(b == 1); |
| } |
| { |
| mpf_class a(-1.5); |
| mpf_class b; |
| b = trunc(a); ASSERT_ALWAYS(b == -1); |
| } |
| |
| // floor |
| { |
| mpf_class a(1.9); |
| mpf_class b; |
| b = floor(a); ASSERT_ALWAYS(b == 1); |
| } |
| { |
| mpf_class a(-1.1); |
| mpf_class b; |
| b = floor(a); ASSERT_ALWAYS(b == -2); |
| } |
| |
| // ceil |
| { |
| mpf_class a(1.1); |
| mpf_class b; |
| b = ceil(a); ASSERT_ALWAYS(b == 2); |
| } |
| { |
| mpf_class a(-1.9); |
| mpf_class b; |
| b = ceil(a); ASSERT_ALWAYS(b == -1); |
| } |
| |
| // sqrt |
| { |
| mpf_class a(25); |
| mpf_class b; |
| b = sqrt(a); ASSERT_ALWAYS(b == 5); |
| } |
| { |
| mpf_class a(2.25); |
| mpf_class b; |
| b = sqrt(a); ASSERT_ALWAYS(b == 1.5); |
| } |
| |
| // sgn |
| { |
| mpf_class a(123); |
| int b = sgn(a); ASSERT_ALWAYS(b == 1); |
| } |
| { |
| mpf_class a(0); |
| int b = sgn(a); ASSERT_ALWAYS(b == 0); |
| } |
| { |
| mpf_class a(-123); |
| int b = sgn(a); ASSERT_ALWAYS(b == -1); |
| } |
| |
| |
| // binary operators and functions |
| |
| // operator+ |
| { |
| mpf_class a(1), b(2); |
| mpf_class c; |
| c = a + b; ASSERT_ALWAYS(c == 3); |
| } |
| |
| // operator- |
| { |
| mpf_class a(3), b(4); |
| mpf_class c; |
| c = a - b; ASSERT_ALWAYS(c == -1); |
| } |
| |
| // operator* |
| { |
| mpf_class a(2), b(5); |
| mpf_class c; |
| c = a * b; ASSERT_ALWAYS(c == 10); |
| } |
| |
| // operator/ |
| { |
| mpf_class a(7), b(4); |
| mpf_class c; |
| c = a / b; ASSERT_ALWAYS(c == 1.75); |
| } |
| |
| // operator<< |
| // operator>> |
| // operator== |
| // operator!= |
| // operator< |
| // operator<= |
| // operator> |
| // operator>= |
| |
| // hypot |
| { |
| mpf_class a(3), b(4); |
| mpf_class c; |
| c = hypot(a, b); ASSERT_ALWAYS(c == 5); |
| } |
| |
| // cmp |
| { |
| mpf_class a(123), b(45); |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpf_class a(123); |
| unsigned long b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpf_class a(123); |
| long b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpf_class a(123); |
| double b = 45; |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpf_class a(123); |
| mpz_class b(45); |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| { |
| mpf_class a(123); |
| mpq_class b(45); |
| int c; |
| c = cmp(a, b); ASSERT_ALWAYS(c > 0); |
| c = cmp(b, a); ASSERT_ALWAYS(c < 0); |
| } |
| } |
| |
| |
| int |
| main (void) |
| { |
| tests_start(); |
| |
| check_mpz(); |
| check_mpq(); |
| check_mpf(); |
| |
| tests_end(); |
| return 0; |
| } |