1 /* Test mp*_class binary expressions.
3 Copyright 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
5 This file is part of the GNU MP Library.
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 3 of the License, or (at your
10 option) any later version.
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.
17 You should have received a copy of the GNU Lesser General Public License
18 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
35 // template <class T, class Op>
36 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> >
39 mpz_class c(a + b); ASSERT_ALWAYS(c == 3);
44 c = a * b; ASSERT_ALWAYS(c == 12);
49 c = a % b; ASSERT_ALWAYS(c == 2);
52 // template <class T, class U, class Op>
53 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> >
57 mpz_class c(a - b); ASSERT_ALWAYS(c == -2);
63 c = a / b; ASSERT_ALWAYS(c == -4);
68 mpz_class c(a + b); ASSERT_ALWAYS(c == 5);
73 b = a + 0; ASSERT_ALWAYS(b == 4);
76 // template <class T, class U, class Op>
77 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> >
81 mpz_class c(b / a); ASSERT_ALWAYS(c == 3);
84 // template <class T, class U, class V, class W, class Op>
85 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> >
86 // type of result can't be mpz
88 // template <class T, class U, class V, class W, class Op>
89 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> >
90 // type of result can't be mpz
92 // template <class T, class U, class Op>
93 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> >
96 mpz_class c(a * (-b)); ASSERT_ALWAYS(c == -12);
99 // template <class T, class U, class Op>
100 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> >
102 mpz_class a(3), b(2), c(1);
104 d = (a % b) + c; ASSERT_ALWAYS(d == 2);
107 // template <class T, class U, class V, class Op>
108 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> >
112 mpz_class c((-a) << b); ASSERT_ALWAYS(c == 20);
115 mpz_class a(5), b(-4);
118 d = (a * b) >> c; ASSERT_ALWAYS(d == -3);
121 // template <class T, class U, class V, class Op>
122 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> >
124 mpz_class a(2), b(4);
126 mpz_class d(c / (a - b)); ASSERT_ALWAYS(d == -3);
129 mpz_class a(3), b(2);
132 d = c + (a + b); ASSERT_ALWAYS(d == 6);
135 // template <class T, class U, class V, class W, class Op>
136 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> >
137 // type of result can't be mpz
139 // template <class T, class U, class V, class W, class Op>
140 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> >
141 // type of result can't be mpz
143 // template <class T, class U, class V, class Op>
144 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, V>, Op> >
146 mpz_class a(3), b(5), c(7);
148 d = (a - b) * (-c); ASSERT_ALWAYS(d == 14);
152 mpz_class a(0xcafe), b(0xbeef), c, want;
153 c = a & b; ASSERT_ALWAYS (c == 0x8aee);
154 c = a | b; ASSERT_ALWAYS (c == 0xfeff);
155 c = a ^ b; ASSERT_ALWAYS (c == 0x7411);
156 c = a & 0xbeef; ASSERT_ALWAYS (c == 0x8aee);
157 c = a | 0xbeef; ASSERT_ALWAYS (c == 0xfeff);
158 c = a ^ 0xbeef; ASSERT_ALWAYS (c == 0x7411);
159 c = a & -0xbeef; ASSERT_ALWAYS (c == 0x4010);
160 c = a | -0xbeef; ASSERT_ALWAYS (c == -0x3401);
161 c = a ^ -0xbeef; ASSERT_ALWAYS (c == -0x7411);
162 c = a & 48879.0; ASSERT_ALWAYS (c == 0x8aee);
163 c = a | 48879.0; ASSERT_ALWAYS (c == 0xfeff);
164 c = a ^ 48879.0; ASSERT_ALWAYS (c == 0x7411);
166 c = a | 1267650600228229401496703205376.0; // 2^100
167 want = "0x1000000000000000000000cafe";
168 ASSERT_ALWAYS (c == want);
176 // template <class T, class Op>
177 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> >
179 mpq_class a(1, 2), b(3, 4);
180 mpq_class c(a + b); ASSERT_ALWAYS(c == 1.25);
183 // template <class T, class U, class Op>
184 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> >
188 mpq_class c(a - b); ASSERT_ALWAYS(c == -2.5);
193 b = a + 0; ASSERT_ALWAYS(b == 0.5);
196 // template <class T, class U, class Op>
197 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> >
202 c = b / a; ASSERT_ALWAYS(c == 6);
205 // template <class T, class U, class V, class Op>
206 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<U, V>, Op> >
210 mpq_class c(a + b); ASSERT_ALWAYS(c == 1.5);
217 d = a * (b + c); ASSERT_ALWAYS(d == 2);
220 // template <class T, class U, class V, class Op>
221 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, T>, Op> >
225 mpq_class c(b / a); ASSERT_ALWAYS(c == 6);
229 mpz_class b(1), c(4);
231 d = (b - c) * a; ASSERT_ALWAYS(d == -2);
234 // template <class T, class U, class Op>
235 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> >
237 mpq_class a(1, 3), b(3, 4);
239 c = a * (-b); ASSERT_ALWAYS(c == -0.25);
242 // template <class T, class U, class Op>
243 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> >
245 mpq_class a(1, 3), b(2, 3), c(1, 4);
246 mpq_class d((a / b) + c); ASSERT_ALWAYS(d == 0.75);
249 // template <class T, class U, class V, class Op>
250 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> >
254 mpq_class c((-a) << b); ASSERT_ALWAYS(c == -6);
257 // template <class T, class U, class V, class Op>
258 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> >
260 mpq_class a(1, 2), b(1, 4);
263 d = c / (a + b); ASSERT_ALWAYS(d == 8);
266 // template <class T, class U, class V, class W, class Op>
267 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> >
269 mpq_class a(1, 2), b(1, 4);
271 mpq_class d((a + b) - c); ASSERT_ALWAYS(d == -0.25);
274 mpq_class a(1, 3), b(3, 2);
275 mpz_class c(2), d(4);
277 e = (a * b) / (c - d); ASSERT_ALWAYS(e == -0.25);
280 // template <class T, class U, class V, class W, class Op>
281 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> >
283 mpq_class a(1, 3), b(3, 4);
285 mpq_class d(c * (a * b)); ASSERT_ALWAYS(d == -0.75);
288 mpq_class a(1, 3), b(3, 5);
292 e = (c % d) / (a * b); ASSERT_ALWAYS(e == 10);
295 // template <class T, class U, class V, class Op>
296 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, V>, Op> >
298 mpq_class a(1, 3), b(3, 4), c(2, 5);
300 d = (a * b) / (-c); ASSERT_ALWAYS(d == -0.625);
307 // template <class T, class Op>
308 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> >
310 mpf_class a(1), b(2);
311 mpf_class c(a + b); ASSERT_ALWAYS(c == 3);
314 mpf_class a(1.5), b(6);
316 c = a / b; ASSERT_ALWAYS(c == 0.25);
319 // template <class T, class U, class Op>
320 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> >
324 mpf_class c(a - b); ASSERT_ALWAYS(c == 3);
329 b = a + 0; ASSERT_ALWAYS(b == 2);
332 // template <class T, class U, class Op>
333 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> >
338 c = b / a; ASSERT_ALWAYS(c == 1.5);
341 // template <class T, class U, class V, class Op>
342 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<U, V>, Op> >
346 mpf_class c(a - b); ASSERT_ALWAYS(c == -1);
350 mpz_class b(2), c(1);
352 d = a * (b + c); ASSERT_ALWAYS(d == 9);
355 // template <class T, class U, class V, class Op>
356 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, T>, Op> >
360 mpf_class c(a * b); ASSERT_ALWAYS(c == 4.5);
363 // template <class T, class U, class Op>
364 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> >
366 mpf_class a(2), b(-3);
368 c = a * (-b); ASSERT_ALWAYS(c == 6);
371 // template <class T, class U, class Op>
372 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> >
374 mpf_class a(3), b(4), c(5);
376 d = (a / b) - c; ASSERT_ALWAYS(d == -4.25);
379 // template <class T, class U, class V, class Op>
380 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> >
384 mpf_class c((-a) >> b); ASSERT_ALWAYS(c == -0.75);
387 // template <class T, class U, class V, class Op>
388 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> >
390 mpf_class a(2), b(3);
393 d = c / (a + b); ASSERT_ALWAYS(d == 1);
396 // template <class T, class U, class V, class W, class Op>
397 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> >
399 mpf_class a(2), b(3);
402 d = (a + b) * c; ASSERT_ALWAYS(d == 20);
405 mpf_class a(2), b(3);
406 mpq_class c(1, 2), d(1, 4);
408 e = (a * b) / (c + d); ASSERT_ALWAYS(e == 8);
411 // template <class T, class U, class V, class W, class Op>
412 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> >
414 mpf_class a(1), b(2);
416 mpf_class d(c / (a + b)); ASSERT_ALWAYS(d == 1);
423 d = (-c) + (a + b); ASSERT_ALWAYS(d == 2.25);
426 // template <class T, class U, class V, class Op>
427 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, V>, Op> >
429 mpf_class a(1), b(2), c(3);
431 d = (a + b) * (-c); ASSERT_ALWAYS(d == -9);