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