Annotation of OpenXM_contrib/gmp/tests/cxx/t-expr.cc, Revision 1.1
1.1 ! ohara 1: /* Test mp*_class arithmetic expressions.
! 2:
! 3: Copyright 2001 Free Software Foundation, Inc.
! 4:
! 5: This file is part of the GNU MP Library.
! 6:
! 7: The GNU MP Library is free software; you can redistribute it and/or modify
! 8: it under the terms of the GNU Lesser General Public License as published by
! 9: the Free Software Foundation; either version 2.1 of the License, or (at your
! 10: option) any later version.
! 11:
! 12: The GNU MP Library is distributed in the hope that it will be useful, but
! 13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
! 15: License for more details.
! 16:
! 17: You should have received a copy of the GNU Lesser General Public License
! 18: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
! 19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 20: MA 02111-1307, USA. */
! 21:
! 22: #include <iostream>
! 23: #include <strstream>
! 24: #include <string>
! 25: #include <cstdlib>
! 26: #include "gmp.h"
! 27: #include "gmp-impl.h"
! 28: #include "gmpxx.h"
! 29: #include "tests.h"
! 30:
! 31: using namespace std;
! 32:
! 33:
! 34: #define CHECK_MPZ(expr, want) \
! 35: do { \
! 36: mpz_set_str (ref, want, 0); \
! 37: if (mpz_cmp (z.get_mpz_t(), ref) != 0) \
! 38: { \
! 39: cout << "mpz_class expression wrong: " << expr << "\n"; \
! 40: cout << " want: " << ref << "\n"; \
! 41: cout << " got: " << z.get_mpz_t() << "\n"; \
! 42: abort (); \
! 43: } \
! 44: } while (0)
! 45:
! 46: #define CHECK_MPQ(expr, want) \
! 47: do { \
! 48: mpq_set_str (ref, want, 0); \
! 49: if (mpq_cmp (q.get_mpq_t(), ref) != 0) \
! 50: { \
! 51: cout << "mpq_class expression wrong: " << expr << "\n"; \
! 52: cout << " want: " << ref << "\n"; \
! 53: cout << " got: " << q.get_mpq_t() << "\n"; \
! 54: abort (); \
! 55: } \
! 56: } while (0)
! 57:
! 58: #define CHECK_MPF(expr, want) \
! 59: do { \
! 60: mpf_set_str (ref, want, 10); \
! 61: if (mpf_cmp (f.get_mpf_t(), ref) != 0) \
! 62: { \
! 63: cout << "mpf_class constructor wrong: " << expr << "\n"; \
! 64: cout << " want: " << ref << "\n"; \
! 65: cout << " got: " << f.get_mpf_t() << "\n"; \
! 66: abort (); \
! 67: } \
! 68: } while (0)
! 69:
! 70: void
! 71: check_mpz (void)
! 72: {
! 73: mpz_class z, w (1), v (2), u(3);
! 74: mpz_t ref;
! 75: mpz_init(ref);
! 76:
! 77: // simple assignments
! 78:
! 79: // mpz_class
! 80: z = w;
! 81: CHECK_MPZ ("z = w", "1");
! 82:
! 83: // int
! 84: z = -1;
! 85: CHECK_MPZ ("z = -1", "-1");
! 86:
! 87: // unsigned long
! 88: z = 3456789012ul;
! 89: CHECK_MPZ ("z = 3456789012ul", "3456789012");
! 90:
! 91: // char *
! 92: z = "12345678901234567890";
! 93: CHECK_MPZ ("z = \"12345678901234567890\"", "12345678901234567890");
! 94:
! 95: // string
! 96: z = string ("1234567890");
! 97: CHECK_MPZ ("z = string (\"1234567890\")", "1234567890");
! 98:
! 99: // compound expressions
! 100:
! 101: // template<class Op>
! 102: // __gmp_expr<__gmpz_value, __gmp_unary_expr<mpz_class, Op> >
! 103: // [Op = __gmp_unary_minus]
! 104: z = -w;
! 105: CHECK_MPZ ("z = -w", "-1");
! 106:
! 107: // template<class Op>
! 108: // __gmp_expr<__gmpz_value, __gmp_binary_expr<mpz_class, mpz_class, Op> >
! 109: // [Op = __gmp_binary_plus]
! 110: z = w + v;
! 111: CHECK_MPZ ("z = w + v", "3");
! 112:
! 113: // template<class T, class Op>
! 114: // __gmp_expr<__gmpz_value, __gmp_binary_expr<mpz_class, T, Op> >
! 115: // [T = int, Op = __gmp_binary_minus]
! 116: z = w - 2;
! 117: CHECK_MPZ ("z = w - 2", "-1");
! 118:
! 119: // template<class T, class Op>
! 120: // __gmp_expr<__gmpz_value, __gmp_binary_expr<T, mpz_class, Op> >
! 121: // [T = int, Op = __gmp_binary_divides]
! 122: z = 3 / w;
! 123: CHECK_MPZ ("z = 3 / w", "3");
! 124:
! 125: // template<class T, class U, class Op>
! 126: // __gmp_expr
! 127: // <__gmpz_value, __gmp_binary_expr<mpz_class, __gmp_expr<T, U>, Op>
! 128: // [T = __gmpz_value, U = __gmp_unary_expr<mpz_class, __gmp_unary_minus>,
! 129: // Op = __gmp_binary_multiplies]
! 130: z = w * (-v);
! 131: CHECK_MPZ ("z = w * (-v)", "-2");
! 132:
! 133: // template<class T, class U, class Op>
! 134: // __gmp_expr<__gmpz_value,
! 135: // __gmp_binary_expr<__gmp_expr<T, U>, mpz_class, Op>
! 136: // [T = __gmpz_value,
! 137: // U = __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_modulus>,
! 138: // Op = __gmp_binary_plus]
! 139: z = (w % v) + u;
! 140: CHECK_MPZ ("z = (w % v) + u", "4");
! 141:
! 142: // template<class T, class U, class V, class Op>
! 143: // __gmp_expr<__gmpz_value, __gmp_binary_expr<__gmp_expr<T, U>, V, Op>
! 144: // [T = __gmpz_value, U = __gmp_unary_expr<mpz_class, __gmp_unary_minus>,
! 145: // V = int, Op = __gmp_binary_lshift]
! 146: z = (-w) << 2;
! 147: CHECK_MPZ ("z = (-w) << 2", "-4");
! 148:
! 149: // template<class T, class U, class V, class Op>
! 150: // __gmp_expr<__gmpz_value, __gmp_binary_expr<T, __gmp_expr<U, V>, Op>
! 151: // [T = double, U = __gmpz_value,
! 152: // V = __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_plus>,
! 153: // Op = __gmp_binary_divides]
! 154: z = 6.0 / (w + v);
! 155: CHECK_MPZ ("z = 6.0 / (w + v)", "2");
! 156:
! 157: // template<class T, class U, class V, class W, class Op>
! 158: // __gmp_expr
! 159: // <__gmpz_value, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op>
! 160: // [T = __gmpz_value,
! 161: // U = __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_minus>,
! 162: // V = __gmpz_value, W = __gmp_unary_expr<mpz_class, __gmp_unary_minus>,
! 163: // Op = __gmp_binary_multiplies]
! 164: z = (w - v) * (-u);
! 165: CHECK_MPZ ("z = (w - v) * (-u)", "3");
! 166:
! 167: mpz_clear(ref);
! 168: }
! 169:
! 170: void
! 171: check_mpq (void)
! 172: {
! 173: mpq_class q, r ("1/2"), s ("3/4"), t ("5/6");
! 174: mpq_t ref;
! 175: mpq_init(ref);
! 176:
! 177: // simple assignments
! 178:
! 179: // mpq_class
! 180: q = r;
! 181: CHECK_MPQ ("q = r", "1/2");
! 182:
! 183: // int
! 184: q = -1;
! 185: CHECK_MPQ ("q = -1", "-1");
! 186:
! 187: // unsigned long
! 188: q = 3456789012ul;
! 189: CHECK_MPQ ("q = 3456789012ul", "3456789012");
! 190:
! 191: // char *
! 192: q = "12345678901234567890";
! 193: CHECK_MPQ ("q = \"12345678901234567890\"", "12345678901234567890");
! 194:
! 195: // string
! 196: q = string ("1234567890");
! 197: CHECK_MPQ ("q = string (\"1234567890\")", "1234567890");
! 198:
! 199: // compound expressions
! 200:
! 201: // template<class Op>
! 202: // __gmp_expr<__gmpq_value, __gmp_unary_expr<mpq_class, Op> >
! 203: // [Op = __gmp_unary_minus]
! 204: q = -r;
! 205: CHECK_MPQ ("q = -r", "-1/2");
! 206:
! 207: // template<class Op>
! 208: // __gmp_expr<__gmpq_value, __gmp_binary_expr<mpq_class, mpq_class, Op> >
! 209: // [Op = __gmp_binary_plus]
! 210: q = r + s;
! 211: CHECK_MPQ ("q = r + s", "5/4");
! 212:
! 213: // template<class T, class Op>
! 214: // __gmp_expr<__gmpq_value, __gmp_binary_expr<mpq_class, T, Op> >
! 215: // [T = int, Op = __gmp_binary_minus]
! 216: q = r - 2;
! 217: CHECK_MPQ ("q = r - 2", "-3/2");
! 218:
! 219: // template<class T, class Op>
! 220: // __gmp_expr<__gmpq_value, __gmp_binary_expr<T, mpq_class, Op> >
! 221: // [T = int, Op = __gmp_binary_divides]
! 222: q = 3 / r;
! 223: CHECK_MPQ ("q = 3 / r", "6");
! 224:
! 225: // template<class T, class U, class Op>
! 226: // __gmp_expr
! 227: // <__gmpq_value, __gmp_binary_expr<mpq_class, __gmp_expr<T, U>, Op>
! 228: // [T = __gmpq_value, U = __gmp_unary_expr<mpq_class, __gmp_unary_minus>,
! 229: // Op = __gmp_binary_multiplies]
! 230: q = r * (-s);
! 231: CHECK_MPQ ("q = r * (-s)", "-3/8");
! 232:
! 233: // template<class T, class U, class Op>
! 234: // __gmp_expr<__gmpq_value,
! 235: // __gmp_binary_expr<__gmp_expr<T, U>, mpq_class, Op>
! 236: // [T = __gmpq_value,
! 237: // U = __gmp_binary_expr<mpq_class, mpq_class, __gmp_binary_divides>,
! 238: // Op = __gmp_binary_plus]
! 239: q = (r / s) + t;
! 240: CHECK_MPQ ("q = (r / s) + t", "3/2");
! 241:
! 242: // template<class T, class U, class V, class Op>
! 243: // __gmp_expr<__gmpq_value, __gmp_binary_expr<__gmp_expr<T, U>, V, Op>
! 244: // [T = __gmpq_value, U = __gmp_unary_expr<mpq_class, __gmp_unary_minus>,
! 245: // V = int, Op = __gmp_binary_lshift]
! 246: q = (-r) << 2;
! 247: CHECK_MPQ ("q = (-r) << 2", "-2");
! 248:
! 249: // template<class T, class U, class V, class Op>
! 250: // __gmp_expr<__gmpq_value, __gmp_binary_expr<T, __gmp_expr<U, V>, Op>
! 251: // [T = double, U = __gmpq_value,
! 252: // V = __gmp_binary_expr<mpq_class, mpq_class, __gmp_binary_plus>,
! 253: // Op = __gmp_binary_divides]
! 254: q = 6.0 / (r + s);
! 255: CHECK_MPQ ("q = 6.0 / (r + s)", "24/5");
! 256:
! 257: // template<class T, class U, class V, class W, class Op>
! 258: // __gmp_expr
! 259: // <__gmpq_value, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op>
! 260: // [T = __gmpq_value,
! 261: // U = __gmp_binary_expr<mpq_class, mpq_class, __gmp_binary_minus>,
! 262: // V = __gmpq_value, W = __gmp_unary_expr<mpq_class, __gmp_unary_minus>,
! 263: // Op = __gmp_binary_multiplies]
! 264: q = (r - s) * (-t);
! 265: CHECK_MPQ ("q = (r - s) * (-t)", "5/24");
! 266:
! 267: mpq_clear(ref);
! 268: }
! 269:
! 270: void
! 271: check_mpf (void)
! 272: {
! 273: mpf_class f, g ("1.0"), h ("0.25"), i ("3e+2");
! 274: mpf_t ref;
! 275: mpf_init(ref);
! 276:
! 277: // simple assignments
! 278:
! 279: // mpf_class
! 280: f = g;
! 281: CHECK_MPF ("f = g", "1.0");
! 282:
! 283: // int
! 284: f = -1;
! 285: CHECK_MPF ("f = -1", "-1.0");
! 286:
! 287: // unsigned long
! 288: f = 3456789012ul;
! 289: CHECK_MPF ("f = 3456789012ul", "3456789012.0");
! 290:
! 291: // char *
! 292: f = "1234567890";
! 293: CHECK_MPF ("f = \"1234567890\"", "1234567890.0");
! 294:
! 295: // string
! 296: f = string ("123456");
! 297: CHECK_MPF ("f = string (\"123456\")", "123456");
! 298:
! 299: // compound expressions
! 300:
! 301: // template<class Op>
! 302: // __gmp_expr<__gmpf_value, __gmp_unary_expr<mpf_class, Op> >
! 303: // [Op = __gmp_unary_minus]
! 304: f = -g;
! 305: CHECK_MPF ("f = -g", "-1.0");
! 306:
! 307: // template<class Op>
! 308: // __gmp_expr<__gmpf_value, __gmp_binary_expr<mpf_class, mpf_class, Op> >
! 309: // [Op = __gmp_binary_plus]
! 310: f = g + h;
! 311: CHECK_MPF ("f = g + h", "1.25");
! 312:
! 313: // template<class T, class Op>
! 314: // __gmp_expr<__gmpf_value, __gmp_binary_expr<mpf_class, T, Op> >
! 315: // [T = int, Op = __gmp_binary_minus]
! 316: f = g - 2;
! 317: CHECK_MPF ("f = g - 2", "-1.0");
! 318:
! 319: // template<class T, class Op>
! 320: // __gmp_expr<__gmpf_value, __gmp_binary_expr<T, mpf_class, Op> >
! 321: // [T = int, Op = __gmp_binary_divides]
! 322: f = 3 / g;
! 323: CHECK_MPF ("f = 3 / g", "3.0");
! 324:
! 325: // template<class T, class U, class Op>
! 326: // __gmp_expr
! 327: // <__gmpf_value, __gmp_binary_expr<mpf_class, __gmp_expr<T, U>, Op>
! 328: // [T = __gmpf_value, U = __gmp_unary_expr<mpf_class, __gmp_unary_minus>,
! 329: // Op = __gmp_binary_multiplies]
! 330: f = g * (-h);
! 331: CHECK_MPF ("f = g * (-h)", "-0.25");
! 332:
! 333: // template<class T, class U, class Op>
! 334: // __gmp_expr<__gmpf_value,
! 335: // __gmp_binary_expr<__gmp_expr<T, U>, mpf_class, Op>
! 336: // [T = __gmpf_value,
! 337: // U = __gmp_binary_expr<mpf_class, mpf_class, __gmp_binary_divides>,
! 338: // Op = __gmp_binary_plus]
! 339: f = (g / h) + i;
! 340: CHECK_MPF ("f = (g / h) + i", "304.0");
! 341:
! 342: // template<class T, class U, class V, class Op>
! 343: // __gmp_expr<__gmpf_value, __gmp_binary_expr<__gmp_expr<T, U>, V, Op>
! 344: // [T = __gmpf_value, U = __gmp_unary_expr<mpf_class, __gmp_unary_minus>,
! 345: // V = int, Op = __gmp_binary_lshift]
! 346: f = (-g) << 2;
! 347: CHECK_MPF ("f = (-g) << 2", "-4.0");
! 348:
! 349: // template<class T, class U, class V, class Op>
! 350: // __gmp_expr<__gmpqfvalue, __gmp_binary_expr<T, __gmp_expr<U, V>, Op>
! 351: // [T = double, U = __gmpf_value,
! 352: // V = __gmp_binary_expr<mpf_class, mpf_class, __gmp_binary_plus>,
! 353: // Op = __gmp_binary_divides]
! 354: f = 5.0 / (g + h);
! 355: CHECK_MPF ("f = 5.0 / (g + h)", "4.0");
! 356:
! 357: // template<class T, class U, class V, class W, class Op>
! 358: // __gmp_expr
! 359: // <__gmpf_value, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op>
! 360: // [T = __gmpf_value,
! 361: // U = __gmp_binary_expr<mpf_class, mpf_class, __gmp_binary_minus>,
! 362: // V = __gmpf_value, W = __gmp_unary_expr<mpf_class, __gmp_unary_minus>,
! 363: // Op = __gmp_binary_multiplies]
! 364: f = (g - h) * (-i);
! 365: CHECK_MPF ("f = (g - h) * (-i)", "-225.0");
! 366:
! 367: mpf_clear(ref);
! 368: }
! 369:
! 370:
! 371: int
! 372: main (int argc, char *argv[])
! 373: {
! 374: tests_start ();
! 375:
! 376: check_mpz ();
! 377: check_mpq ();
! 378: check_mpf ();
! 379:
! 380: tests_end ();
! 381: exit (0);
! 382: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>