| /* Test mp*_class functions. |
| |
| Copyright 2002, 2003 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/. */ |
| |
| |
| /* Note that we don't use <climits> for LONG_MIN, but instead our own |
| definitions in gmp-impl.h. In g++ 2.95.4 (debian 3.0) under |
| -mcpu=ultrasparc, limits.h sees __sparc_v9__ defined and assumes that |
| means long is 64-bit long, but it's only 32-bits, causing fatal compile |
| errors. */ |
| |
| #include "config.h" |
| |
| #include <string> |
| |
| #include "gmpxx.h" |
| #include "gmp-impl.h" |
| #include "tests.h" |
| |
| using namespace std; |
| |
| |
| void |
| check_mpz (void) |
| { |
| // mpz_class::fits_sint_p |
| { |
| bool fits; |
| mpz_class z; |
| z = INT_MIN; fits = z.fits_sint_p(); ASSERT_ALWAYS (fits); |
| z--; fits = z.fits_sint_p(); ASSERT_ALWAYS (! fits); |
| z = INT_MAX; fits = z.fits_sint_p(); ASSERT_ALWAYS (fits); |
| z++; fits = z.fits_sint_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpz_class::fits_uint_p |
| { |
| bool fits; |
| mpz_class z; |
| z = 0; fits = z.fits_uint_p(); ASSERT_ALWAYS (fits); |
| z--; fits = z.fits_uint_p(); ASSERT_ALWAYS (! fits); |
| z = UINT_MAX; fits = z.fits_uint_p(); ASSERT_ALWAYS (fits); |
| z++; fits = z.fits_uint_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpz_class::fits_slong_p |
| { |
| bool fits; |
| mpz_class z; |
| z = LONG_MIN; fits = z.fits_slong_p(); ASSERT_ALWAYS (fits); |
| z--; fits = z.fits_slong_p(); ASSERT_ALWAYS (! fits); |
| z = LONG_MAX; fits = z.fits_slong_p(); ASSERT_ALWAYS (fits); |
| z++; fits = z.fits_slong_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpz_class::fits_ulong_p |
| { |
| bool fits; |
| mpz_class z; |
| z = 0; fits = z.fits_ulong_p(); ASSERT_ALWAYS (fits); |
| z--; fits = z.fits_ulong_p(); ASSERT_ALWAYS (! fits); |
| z = ULONG_MAX; fits = z.fits_ulong_p(); ASSERT_ALWAYS (fits); |
| z++; fits = z.fits_ulong_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpz_class::fits_sshort_p |
| { |
| bool fits; |
| mpz_class z; |
| z = SHRT_MIN; fits = z.fits_sshort_p(); ASSERT_ALWAYS (fits); |
| z--; fits = z.fits_sshort_p(); ASSERT_ALWAYS (! fits); |
| z = SHRT_MAX; fits = z.fits_sshort_p(); ASSERT_ALWAYS (fits); |
| z++; fits = z.fits_sshort_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpz_class::fits_ushort_p |
| { |
| bool fits; |
| mpz_class z; |
| z = 0; fits = z.fits_ushort_p(); ASSERT_ALWAYS (fits); |
| z--; fits = z.fits_ushort_p(); ASSERT_ALWAYS (! fits); |
| z = USHRT_MAX; fits = z.fits_ushort_p(); ASSERT_ALWAYS (fits); |
| z++; fits = z.fits_ushort_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpz_class::get_mpz_t |
| { |
| mpz_class z(0); |
| mpz_ptr p = z.get_mpz_t(); |
| ASSERT_ALWAYS (mpz_cmp_ui (p, 0) == 0); |
| } |
| { |
| mpz_class z(0); |
| mpz_srcptr p = z.get_mpz_t(); |
| ASSERT_ALWAYS (mpz_cmp_ui (p, 0) == 0); |
| } |
| |
| // mpz_class::get_d |
| // mpz_class::get_si |
| // mpz_class::get_ui |
| { |
| mpz_class z(123); |
| { double d = z.get_d(); ASSERT_ALWAYS (d == 123.0); } |
| { long l = z.get_si(); ASSERT_ALWAYS (l == 123L); } |
| { long u = z.get_ui(); ASSERT_ALWAYS (u == 123L); } |
| } |
| { |
| mpz_class z(-123); |
| { double d = z.get_d(); ASSERT_ALWAYS (d == -123.0); } |
| { long l = z.get_si(); ASSERT_ALWAYS (l == -123L); } |
| } |
| |
| // mpz_class::get_str |
| { |
| mpz_class z(123); |
| string s; |
| s = z.get_str(); ASSERT_ALWAYS (s == "123"); |
| s = z.get_str(16); ASSERT_ALWAYS (s == "7b"); |
| s = z.get_str(-16); ASSERT_ALWAYS (s == "7B"); |
| } |
| |
| // mpz_class::set_str |
| { |
| mpz_class z; |
| int ret; |
| ret = z.set_str ("123", 10); ASSERT_ALWAYS (ret == 0 && z == 123); |
| ret = z.set_str ("7b", 16); ASSERT_ALWAYS (ret == 0 && z == 123); |
| ret = z.set_str ("7B", 16); ASSERT_ALWAYS (ret == 0 && z == 123); |
| ret = z.set_str ("0x7B", 0); ASSERT_ALWAYS (ret == 0 && z == 123); |
| |
| ret = z.set_str (string("123"), 10); ASSERT_ALWAYS (ret == 0 && z == 123); |
| ret = z.set_str (string("7b"), 16); ASSERT_ALWAYS (ret == 0 && z == 123); |
| ret = z.set_str (string("7B"), 16); ASSERT_ALWAYS (ret == 0 && z == 123); |
| ret = z.set_str (string("0x7B"), 0); ASSERT_ALWAYS (ret == 0 && z == 123); |
| } |
| } |
| |
| void |
| check_mpq (void) |
| { |
| // mpq_class::canonicalize |
| { |
| mpq_class q(12,9); |
| q.canonicalize(); |
| ASSERT_ALWAYS (q.get_num() == 4); |
| ASSERT_ALWAYS (q.get_den() == 3); |
| } |
| |
| // mpq_class::get_d |
| { |
| mpq_class q(123); |
| { double d = q.get_d(); ASSERT_ALWAYS (d == 123.0); } |
| } |
| { |
| mpq_class q(-123); |
| { double d = q.get_d(); ASSERT_ALWAYS (d == -123.0); } |
| } |
| |
| // mpq_class::get_mpq_t |
| { |
| mpq_class q(0); |
| mpq_ptr p = q.get_mpq_t(); |
| ASSERT_ALWAYS (mpq_cmp_ui (p, 0, 1) == 0); |
| } |
| { |
| mpq_class q(0); |
| mpq_srcptr p = q.get_mpq_t(); |
| ASSERT_ALWAYS (mpq_cmp_ui (p, 0, 1) == 0); |
| } |
| |
| // mpq_class::get_num, mpq_class::get_den |
| { |
| const mpq_class q(4,5); |
| mpz_class z; |
| z = q.get_num(); ASSERT_ALWAYS (z == 4); |
| z = q.get_den(); ASSERT_ALWAYS (z == 5); |
| } |
| |
| // mpq_class::get_num_mpz_t, mpq_class::get_den_mpz_t |
| { |
| mpq_class q(4,5); |
| mpz_ptr p; |
| p = q.get_num_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 4) == 0); |
| p = q.get_den_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 5) == 0); |
| } |
| { |
| const mpq_class q(4,5); |
| mpz_srcptr p; |
| p = q.get_num_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 4) == 0); |
| p = q.get_den_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 5) == 0); |
| } |
| |
| // mpq_class::get_str |
| { |
| mpq_class q(17,11); |
| string s; |
| s = q.get_str(); ASSERT_ALWAYS (s == "17/11"); |
| s = q.get_str(10); ASSERT_ALWAYS (s == "17/11"); |
| s = q.get_str(16); ASSERT_ALWAYS (s == "11/b"); |
| s = q.get_str(-16); ASSERT_ALWAYS (s == "11/B"); |
| } |
| |
| // mpq_class::set_str |
| { |
| mpq_class q; |
| int ret; |
| ret = q.set_str ("123", 10); ASSERT_ALWAYS (ret == 0 && q == 123); |
| ret = q.set_str ("4/5", 10); ASSERT_ALWAYS (ret == 0 && q == mpq_class(4,5)); |
| ret = q.set_str ("7b", 16); ASSERT_ALWAYS (ret == 0 && q == 123); |
| ret = q.set_str ("7B", 16); ASSERT_ALWAYS (ret == 0 && q == 123); |
| ret = q.set_str ("0x7B", 0); ASSERT_ALWAYS (ret == 0 && q == 123); |
| ret = q.set_str ("0x10/17", 0); ASSERT_ALWAYS (ret == 0 && q == mpq_class(16,17)); |
| |
| ret = q.set_str (string("4/5"), 10); ASSERT_ALWAYS (ret == 0 && q == mpq_class(4,5)); |
| ret = q.set_str (string("123"), 10); ASSERT_ALWAYS (ret == 0 && q == 123); |
| ret = q.set_str (string("7b"), 16); ASSERT_ALWAYS (ret == 0 && q == 123); |
| ret = q.set_str (string("7B"), 16); ASSERT_ALWAYS (ret == 0 && q == 123); |
| ret = q.set_str (string("0x7B"), 0); ASSERT_ALWAYS (ret == 0 && q == 123); |
| ret = q.set_str (string("0x10/17"), 0); ASSERT_ALWAYS (ret == 0 && q == mpq_class(16,17)); |
| } |
| } |
| |
| void |
| check_mpf (void) |
| { |
| // mpf_class::fits_sint_p |
| { |
| bool fits; |
| mpf_class f (0, 2*8*sizeof(int)); |
| f = INT_MIN; fits = f.fits_sint_p(); ASSERT_ALWAYS (fits); |
| f--; fits = f.fits_sint_p(); ASSERT_ALWAYS (! fits); |
| f = INT_MAX; fits = f.fits_sint_p(); ASSERT_ALWAYS (fits); |
| f++; fits = f.fits_sint_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpf_class::fits_uint_p |
| { |
| bool fits; |
| mpf_class f (0, 2*8*sizeof(int)); |
| f = 0; fits = f.fits_uint_p(); ASSERT_ALWAYS (fits); |
| f--; fits = f.fits_uint_p(); ASSERT_ALWAYS (! fits); |
| f = UINT_MAX; fits = f.fits_uint_p(); ASSERT_ALWAYS (fits); |
| f++; fits = f.fits_uint_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpf_class::fits_slong_p |
| { |
| bool fits; |
| mpf_class f (0, 2*8*sizeof(long)); |
| f = LONG_MIN; fits = f.fits_slong_p(); ASSERT_ALWAYS (fits); |
| f--; fits = f.fits_slong_p(); ASSERT_ALWAYS (! fits); |
| f = LONG_MAX; fits = f.fits_slong_p(); ASSERT_ALWAYS (fits); |
| f++; fits = f.fits_slong_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpf_class::fits_ulong_p |
| { |
| bool fits; |
| mpf_class f (0, 2*8*sizeof(long)); |
| f = 0; fits = f.fits_ulong_p(); ASSERT_ALWAYS (fits); |
| f--; fits = f.fits_ulong_p(); ASSERT_ALWAYS (! fits); |
| f = ULONG_MAX; fits = f.fits_ulong_p(); ASSERT_ALWAYS (fits); |
| f++; fits = f.fits_ulong_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpf_class::fits_sshort_p |
| { |
| bool fits; |
| mpf_class f (0, 2*8*sizeof(short)); |
| f = SHRT_MIN; fits = f.fits_sshort_p(); ASSERT_ALWAYS (fits); |
| f--; fits = f.fits_sshort_p(); ASSERT_ALWAYS (! fits); |
| f = SHRT_MAX; fits = f.fits_sshort_p(); ASSERT_ALWAYS (fits); |
| f++; fits = f.fits_sshort_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpf_class::fits_ushort_p |
| { |
| bool fits; |
| mpf_class f (0, 2*8*sizeof(short)); |
| f = 0; fits = f.fits_ushort_p(); ASSERT_ALWAYS (fits); |
| f--; fits = f.fits_ushort_p(); ASSERT_ALWAYS (! fits); |
| f = USHRT_MAX; fits = f.fits_ushort_p(); ASSERT_ALWAYS (fits); |
| f++; fits = f.fits_ushort_p(); ASSERT_ALWAYS (! fits); |
| } |
| |
| // mpf_class::get_d |
| // mpf_class::get_si |
| // mpf_class::get_ui |
| { |
| mpf_class f(123); |
| { double d = f.get_d(); ASSERT_ALWAYS (d == 123.0); } |
| { long l = f.get_si(); ASSERT_ALWAYS (l == 123L); } |
| { long u = f.get_ui(); ASSERT_ALWAYS (u == 123L); } |
| } |
| { |
| mpf_class f(-123); |
| { double d = f.get_d(); ASSERT_ALWAYS (d == -123.0); } |
| { long l = f.get_si(); ASSERT_ALWAYS (l == -123L); } |
| } |
| |
| // mpf_class::get_prec |
| { |
| mpf_class f; |
| ASSERT_ALWAYS (f.get_prec() == mpf_get_default_prec()); |
| } |
| |
| // mpf_class::get_str |
| { |
| mpf_class f(123); |
| string s; |
| mp_exp_t e; |
| s = f.get_str(e); ASSERT_ALWAYS (s == "123" && e == 3); |
| s = f.get_str(e, 16); ASSERT_ALWAYS (s == "7b" && e == 2); |
| s = f.get_str(e, -16); ASSERT_ALWAYS (s == "7B" && e == 2); |
| s = f.get_str(e, 10, 2); ASSERT_ALWAYS (s == "12" && e == 3); |
| s = f.get_str(e, 10, 1); ASSERT_ALWAYS (s == "1" && e == 3); |
| } |
| |
| // mpf_class::set_str |
| { |
| mpf_class f; |
| int ret; |
| ret = f.set_str ("123", 10); ASSERT_ALWAYS (ret == 0 && f == 123); |
| ret = f.set_str ("123e1", 10); ASSERT_ALWAYS (ret == 0 && f == 1230); |
| ret = f.set_str ("1230e-1", 10); ASSERT_ALWAYS (ret == 0 && f == 123); |
| ret = f.set_str ("7b", 16); ASSERT_ALWAYS (ret == 0 && f == 123); |
| ret = f.set_str ("7B", 16); ASSERT_ALWAYS (ret == 0 && f == 123); |
| ret = f.set_str ("7B@1", 16); ASSERT_ALWAYS (ret == 0 && f == 1968); |
| ret = f.set_str ("7B0@-1", 16); ASSERT_ALWAYS (ret == 0 && f == 123); |
| |
| ret = f.set_str (string("123"), 10); ASSERT_ALWAYS (ret == 0 && f == 123); |
| ret = f.set_str (string("123e1"), 10); ASSERT_ALWAYS (ret == 0 && f == 1230); |
| ret = f.set_str (string("1230e-1"), 10); ASSERT_ALWAYS (ret == 0 && f == 123); |
| ret = f.set_str (string("7b"), 16); ASSERT_ALWAYS (ret == 0 && f == 123); |
| ret = f.set_str (string("7B"), 16); ASSERT_ALWAYS (ret == 0 && f == 123); |
| ret = f.set_str (string("7B@1"), 16); ASSERT_ALWAYS (ret == 0 && f == 1968); |
| ret = f.set_str (string("7B0@-1"), 16); ASSERT_ALWAYS (ret == 0 && f == 123); |
| } |
| |
| // mpf_class::set_prec |
| { |
| mpf_class f; |
| f.set_prec (256); |
| ASSERT_ALWAYS (f.get_prec () >= 256); |
| } |
| |
| // mpf_class::set_prec_raw |
| { |
| mpf_class f (0, 100 * GMP_NUMB_BITS); |
| f.set_prec_raw (5 * GMP_NUMB_BITS); |
| ASSERT_ALWAYS (f.get_prec () >= 5 * GMP_NUMB_BITS); |
| ASSERT_ALWAYS (f.get_prec () < 100 * GMP_NUMB_BITS); |
| f.set_prec_raw (100 * GMP_NUMB_BITS); |
| } |
| } |
| |
| // std::numeric_limits |
| void |
| check_limits (void) |
| { |
| // Check that the content is not private. |
| ASSERT_ALWAYS ( std::numeric_limits<mpz_class>::is_integer); |
| ASSERT_ALWAYS (!std::numeric_limits<mpf_class>::is_integer); |
| |
| // Check that symbols are emitted. |
| ASSERT_ALWAYS (&std::numeric_limits<mpz_class>::is_integer |
| != &std::numeric_limits<mpq_class>::is_integer); |
| } |
| |
| int |
| main (void) |
| { |
| tests_start(); |
| |
| check_mpz(); |
| check_mpq(); |
| check_mpf(); |
| check_limits(); |
| |
| tests_end(); |
| return 0; |
| } |