t-misc.cc revision 1.1.1.1
1/* Test mp*_class functions. 2 3Copyright 2002, 2003 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of the GNU Lesser General Public License as published by 9the Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12The GNU MP Library is distributed in the hope that it will be useful, but 13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15License for more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ 19 20 21/* Note that we don't use <climits> for LONG_MIN, but instead our own 22 definitions in gmp-impl.h. In g++ 2.95.4 (debian 3.0) under 23 -mcpu=ultrasparc, limits.h sees __sparc_v9__ defined and assumes that 24 means long is 64-bit long, but it's only 32-bits, causing fatal compile 25 errors. */ 26 27#include "config.h" 28 29#include <string> 30 31#include "gmp.h" 32#include "gmpxx.h" 33#include "gmp-impl.h" 34#include "tests.h" 35 36using namespace std; 37 38 39void 40check_mpz (void) 41{ 42 // mpz_class::fits_sint_p 43 { 44 int fits; 45 mpz_class z; 46 z = INT_MIN; fits = z.fits_sint_p(); ASSERT_ALWAYS (fits); 47 z--; fits = z.fits_sint_p(); ASSERT_ALWAYS (! fits); 48 z = INT_MAX; fits = z.fits_sint_p(); ASSERT_ALWAYS (fits); 49 z++; fits = z.fits_sint_p(); ASSERT_ALWAYS (! fits); 50 } 51 52 // mpz_class::fits_uint_p 53 { 54 int fits; 55 mpz_class z; 56 z = 0; fits = z.fits_uint_p(); ASSERT_ALWAYS (fits); 57 z--; fits = z.fits_uint_p(); ASSERT_ALWAYS (! fits); 58 z = UINT_MAX; fits = z.fits_uint_p(); ASSERT_ALWAYS (fits); 59 z++; fits = z.fits_uint_p(); ASSERT_ALWAYS (! fits); 60 } 61 62 // mpz_class::fits_slong_p 63 { 64 int fits; 65 mpz_class z; 66 z = LONG_MIN; fits = z.fits_slong_p(); ASSERT_ALWAYS (fits); 67 z--; fits = z.fits_slong_p(); ASSERT_ALWAYS (! fits); 68 z = LONG_MAX; fits = z.fits_slong_p(); ASSERT_ALWAYS (fits); 69 z++; fits = z.fits_slong_p(); ASSERT_ALWAYS (! fits); 70 } 71 72 // mpz_class::fits_ulong_p 73 { 74 int fits; 75 mpz_class z; 76 z = 0; fits = z.fits_ulong_p(); ASSERT_ALWAYS (fits); 77 z--; fits = z.fits_ulong_p(); ASSERT_ALWAYS (! fits); 78 z = ULONG_MAX; fits = z.fits_ulong_p(); ASSERT_ALWAYS (fits); 79 z++; fits = z.fits_ulong_p(); ASSERT_ALWAYS (! fits); 80 } 81 82 // mpz_class::fits_sshort_p 83 { 84 int fits; 85 mpz_class z; 86 z = SHRT_MIN; fits = z.fits_sshort_p(); ASSERT_ALWAYS (fits); 87 z--; fits = z.fits_sshort_p(); ASSERT_ALWAYS (! fits); 88 z = SHRT_MAX; fits = z.fits_sshort_p(); ASSERT_ALWAYS (fits); 89 z++; fits = z.fits_sshort_p(); ASSERT_ALWAYS (! fits); 90 } 91 92 // mpz_class::fits_ushort_p 93 { 94 int fits; 95 mpz_class z; 96 z = 0; fits = z.fits_ushort_p(); ASSERT_ALWAYS (fits); 97 z--; fits = z.fits_ushort_p(); ASSERT_ALWAYS (! fits); 98 z = USHRT_MAX; fits = z.fits_ushort_p(); ASSERT_ALWAYS (fits); 99 z++; fits = z.fits_ushort_p(); ASSERT_ALWAYS (! fits); 100 } 101 102 // mpz_class::get_mpz_t 103 { 104 mpz_class z(0); 105 mpz_ptr p = z.get_mpz_t(); 106 ASSERT_ALWAYS (mpz_cmp_ui (p, 0) == 0); 107 } 108 { 109 mpz_class z(0); 110 mpz_srcptr p = z.get_mpz_t(); 111 ASSERT_ALWAYS (mpz_cmp_ui (p, 0) == 0); 112 } 113 114 // mpz_class::get_d 115 // mpz_class::get_si 116 // mpz_class::get_ui 117 { 118 mpz_class z(123); 119 { double d = z.get_d(); ASSERT_ALWAYS (d == 123.0); } 120 { long l = z.get_si(); ASSERT_ALWAYS (l == 123L); } 121 { long u = z.get_ui(); ASSERT_ALWAYS (u == 123L); } 122 } 123 { 124 mpz_class z(-123); 125 { double d = z.get_d(); ASSERT_ALWAYS (d == -123.0); } 126 { long l = z.get_si(); ASSERT_ALWAYS (l == -123L); } 127 } 128 129 // mpz_class::get_str 130 { 131 mpz_class z(123); 132 string s; 133 s = z.get_str(); ASSERT_ALWAYS (s == "123"); 134 s = z.get_str(16); ASSERT_ALWAYS (s == "7b"); 135 s = z.get_str(-16); ASSERT_ALWAYS (s == "7B"); 136 } 137 138 // mpz_class::set_str 139 { 140 mpz_class z; 141 int ret; 142 ret = z.set_str ("123", 10); ASSERT_ALWAYS (ret == 0 && z == 123); 143 ret = z.set_str ("7b", 16); ASSERT_ALWAYS (ret == 0 && z == 123); 144 ret = z.set_str ("7B", 16); ASSERT_ALWAYS (ret == 0 && z == 123); 145 ret = z.set_str ("0x7B", 0); ASSERT_ALWAYS (ret == 0 && z == 123); 146 147 ret = z.set_str (string("123"), 10); ASSERT_ALWAYS (ret == 0 && z == 123); 148 ret = z.set_str (string("7b"), 16); ASSERT_ALWAYS (ret == 0 && z == 123); 149 ret = z.set_str (string("7B"), 16); ASSERT_ALWAYS (ret == 0 && z == 123); 150 ret = z.set_str (string("0x7B"), 0); ASSERT_ALWAYS (ret == 0 && z == 123); 151 } 152} 153 154void 155check_mpq (void) 156{ 157 // mpq_class::canonicalize 158 { 159 mpq_class q(12,9); 160 q.canonicalize(); 161 ASSERT_ALWAYS (q.get_num() == 4); 162 ASSERT_ALWAYS (q.get_den() == 3); 163 } 164 165 // mpq_class::get_d 166 { 167 mpq_class q(123); 168 { double d = q.get_d(); ASSERT_ALWAYS (d == 123.0); } 169 } 170 { 171 mpq_class q(-123); 172 { double d = q.get_d(); ASSERT_ALWAYS (d == -123.0); } 173 } 174 175 // mpq_class::get_mpq_t 176 { 177 mpq_class q(0); 178 mpq_ptr p = q.get_mpq_t(); 179 ASSERT_ALWAYS (mpq_cmp_ui (p, 0, 1) == 0); 180 } 181 { 182 mpq_class q(0); 183 mpq_srcptr p = q.get_mpq_t(); 184 ASSERT_ALWAYS (mpq_cmp_ui (p, 0, 1) == 0); 185 } 186 187 // mpq_class::get_num, mpq_class::get_den 188 { 189 mpq_class q(4,5); 190 mpz_class z; 191 z = q.get_num(); ASSERT_ALWAYS (z == 4); 192 z = q.get_den(); ASSERT_ALWAYS (z == 5); 193 } 194 195 // mpq_class::get_num_mpz_t, mpq_class::get_den_mpz_t 196 { 197 mpq_class q(4,5); 198 mpz_ptr p; 199 p = q.get_num_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 4) == 0); 200 p = q.get_den_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 5) == 0); 201 } 202 { 203 mpq_class q(4,5); 204 mpz_srcptr p; 205 p = q.get_num_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 4) == 0); 206 p = q.get_den_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 5) == 0); 207 } 208 209 // mpq_class::get_str 210 { 211 mpq_class q(17,11); 212 string s; 213 s = q.get_str(); ASSERT_ALWAYS (s == "17/11"); 214 s = q.get_str(10); ASSERT_ALWAYS (s == "17/11"); 215 s = q.get_str(16); ASSERT_ALWAYS (s == "11/b"); 216 s = q.get_str(-16); ASSERT_ALWAYS (s == "11/B"); 217 } 218 219 // mpq_class::set_str 220 { 221 mpq_class q; 222 int ret; 223 ret = q.set_str ("123", 10); ASSERT_ALWAYS (ret == 0 && q == 123); 224 ret = q.set_str ("4/5", 10); ASSERT_ALWAYS (ret == 0 && q == mpq_class(4,5)); 225 ret = q.set_str ("7b", 16); ASSERT_ALWAYS (ret == 0 && q == 123); 226 ret = q.set_str ("7B", 16); ASSERT_ALWAYS (ret == 0 && q == 123); 227 ret = q.set_str ("0x7B", 0); ASSERT_ALWAYS (ret == 0 && q == 123); 228 ret = q.set_str ("0x10/17", 0); ASSERT_ALWAYS (ret == 0 && q == mpq_class(16,17)); 229 230 ret = q.set_str (string("4/5"), 10); ASSERT_ALWAYS (ret == 0 && q == mpq_class(4,5)); 231 ret = q.set_str (string("123"), 10); ASSERT_ALWAYS (ret == 0 && q == 123); 232 ret = q.set_str (string("7b"), 16); ASSERT_ALWAYS (ret == 0 && q == 123); 233 ret = q.set_str (string("7B"), 16); ASSERT_ALWAYS (ret == 0 && q == 123); 234 ret = q.set_str (string("0x7B"), 0); ASSERT_ALWAYS (ret == 0 && q == 123); 235 ret = q.set_str (string("0x10/17"), 0); ASSERT_ALWAYS (ret == 0 && q == mpq_class(16,17)); 236 } 237} 238 239void 240check_mpf (void) 241{ 242 // mpf_class::fits_sint_p 243 { 244 int fits; 245 mpf_class f (0, 2*8*sizeof(int)); 246 f = INT_MIN; fits = f.fits_sint_p(); ASSERT_ALWAYS (fits); 247 f--; fits = f.fits_sint_p(); ASSERT_ALWAYS (! fits); 248 f = INT_MAX; fits = f.fits_sint_p(); ASSERT_ALWAYS (fits); 249 f++; fits = f.fits_sint_p(); ASSERT_ALWAYS (! fits); 250 } 251 252 // mpf_class::fits_uint_p 253 { 254 int fits; 255 mpf_class f (0, 2*8*sizeof(int)); 256 f = 0; fits = f.fits_uint_p(); ASSERT_ALWAYS (fits); 257 f--; fits = f.fits_uint_p(); ASSERT_ALWAYS (! fits); 258 f = UINT_MAX; fits = f.fits_uint_p(); ASSERT_ALWAYS (fits); 259 f++; fits = f.fits_uint_p(); ASSERT_ALWAYS (! fits); 260 } 261 262 // mpf_class::fits_slong_p 263 { 264 int fits; 265 mpf_class f (0, 2*8*sizeof(long)); 266 f = LONG_MIN; fits = f.fits_slong_p(); ASSERT_ALWAYS (fits); 267 f--; fits = f.fits_slong_p(); ASSERT_ALWAYS (! fits); 268 f = LONG_MAX; fits = f.fits_slong_p(); ASSERT_ALWAYS (fits); 269 f++; fits = f.fits_slong_p(); ASSERT_ALWAYS (! fits); 270 } 271 272 // mpf_class::fits_ulong_p 273 { 274 int fits; 275 mpf_class f (0, 2*8*sizeof(long)); 276 f = 0; fits = f.fits_ulong_p(); ASSERT_ALWAYS (fits); 277 f--; fits = f.fits_ulong_p(); ASSERT_ALWAYS (! fits); 278 f = ULONG_MAX; fits = f.fits_ulong_p(); ASSERT_ALWAYS (fits); 279 f++; fits = f.fits_ulong_p(); ASSERT_ALWAYS (! fits); 280 } 281 282 // mpf_class::fits_sshort_p 283 { 284 int fits; 285 mpf_class f (0, 2*8*sizeof(short)); 286 f = SHRT_MIN; fits = f.fits_sshort_p(); ASSERT_ALWAYS (fits); 287 f--; fits = f.fits_sshort_p(); ASSERT_ALWAYS (! fits); 288 f = SHRT_MAX; fits = f.fits_sshort_p(); ASSERT_ALWAYS (fits); 289 f++; fits = f.fits_sshort_p(); ASSERT_ALWAYS (! fits); 290 } 291 292 // mpf_class::fits_ushort_p 293 { 294 int fits; 295 mpf_class f (0, 2*8*sizeof(short)); 296 f = 0; fits = f.fits_ushort_p(); ASSERT_ALWAYS (fits); 297 f--; fits = f.fits_ushort_p(); ASSERT_ALWAYS (! fits); 298 f = USHRT_MAX; fits = f.fits_ushort_p(); ASSERT_ALWAYS (fits); 299 f++; fits = f.fits_ushort_p(); ASSERT_ALWAYS (! fits); 300 } 301 302 // mpf_class::get_d 303 // mpf_class::get_si 304 // mpf_class::get_ui 305 { 306 mpf_class f(123); 307 { double d = f.get_d(); ASSERT_ALWAYS (d == 123.0); } 308 { long l = f.get_si(); ASSERT_ALWAYS (l == 123L); } 309 { long u = f.get_ui(); ASSERT_ALWAYS (u == 123L); } 310 } 311 { 312 mpf_class f(-123); 313 { double d = f.get_d(); ASSERT_ALWAYS (d == -123.0); } 314 { long l = f.get_si(); ASSERT_ALWAYS (l == -123L); } 315 } 316 317 // mpf_class::get_prec 318 { 319 mpf_class f; 320 ASSERT_ALWAYS (f.get_prec() == mpf_get_default_prec()); 321 } 322 323 // mpf_class::get_str 324 { 325 mpf_class f(123); 326 string s; 327 mp_exp_t e; 328 s = f.get_str(e); ASSERT_ALWAYS (s == "123" && e == 3); 329 s = f.get_str(e, 16); ASSERT_ALWAYS (s == "7b" && e == 2); 330 s = f.get_str(e, -16); ASSERT_ALWAYS (s == "7B" && e == 2); 331 s = f.get_str(e, 10, 2); ASSERT_ALWAYS (s == "12" && e == 3); 332 s = f.get_str(e, 10, 1); ASSERT_ALWAYS (s == "1" && e == 3); 333 } 334 335 // mpf_class::set_str 336 { 337 mpf_class f; 338 int ret; 339 ret = f.set_str ("123", 10); ASSERT_ALWAYS (ret == 0 && f == 123); 340 ret = f.set_str ("123e1", 10); ASSERT_ALWAYS (ret == 0 && f == 1230); 341 ret = f.set_str ("1230e-1", 10); ASSERT_ALWAYS (ret == 0 && f == 123); 342 ret = f.set_str ("7b", 16); ASSERT_ALWAYS (ret == 0 && f == 123); 343 ret = f.set_str ("7B", 16); ASSERT_ALWAYS (ret == 0 && f == 123); 344 ret = f.set_str ("7B@1", 16); ASSERT_ALWAYS (ret == 0 && f == 1968); 345 ret = f.set_str ("7B0@-1", 16); ASSERT_ALWAYS (ret == 0 && f == 123); 346 347 ret = f.set_str (string("123"), 10); ASSERT_ALWAYS (ret == 0 && f == 123); 348 ret = f.set_str (string("123e1"), 10); ASSERT_ALWAYS (ret == 0 && f == 1230); 349 ret = f.set_str (string("1230e-1"), 10); ASSERT_ALWAYS (ret == 0 && f == 123); 350 ret = f.set_str (string("7b"), 16); ASSERT_ALWAYS (ret == 0 && f == 123); 351 ret = f.set_str (string("7B"), 16); ASSERT_ALWAYS (ret == 0 && f == 123); 352 ret = f.set_str (string("7B@1"), 16); ASSERT_ALWAYS (ret == 0 && f == 1968); 353 ret = f.set_str (string("7B0@-1"), 16); ASSERT_ALWAYS (ret == 0 && f == 123); 354 } 355 356 // mpf_class::set_prec 357 { 358 mpf_class f; 359 f.set_prec (256); 360 ASSERT_ALWAYS (f.get_prec () >= 256); 361 } 362 363 // mpf_class::set_prec_raw 364 { 365 mpf_class f (0, 100 * GMP_NUMB_BITS); 366 f.set_prec_raw (5 * GMP_NUMB_BITS); 367 ASSERT_ALWAYS (f.get_prec () >= 5 * GMP_NUMB_BITS); 368 ASSERT_ALWAYS (f.get_prec () < 100 * GMP_NUMB_BITS); 369 f.set_prec_raw (100 * GMP_NUMB_BITS); 370 } 371} 372 373 374int 375main (void) 376{ 377 tests_start(); 378 379 check_mpz(); 380 check_mpq(); 381 check_mpf(); 382 383 tests_end(); 384 return 0; 385} 386