xref: /netbsd-src/external/lgpl3/gmp/dist/tests/cxx/t-binary.cc (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
1 /* Test mp*_class binary expressions.
2 
3 Copyright 2001, 2002, 2003, 2008 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 3 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.  If not, see http://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 
29 using namespace std;
30 
31 
32 void
33 check_mpz (void)
34 {
35   // template <class T, class Op>
36   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> >
37   {
38     mpz_class a(1), b(2);
39     mpz_class c(a + b); ASSERT_ALWAYS(c == 3);
40   }
41   {
42     mpz_class a(3), b(4);
43     mpz_class c;
44     c = a * b; ASSERT_ALWAYS(c == 12);
45   }
46   {
47     mpz_class a(5), b(3);
48     mpz_class c;
49     c = a % b; ASSERT_ALWAYS(c == 2);
50   }
51 
52   // template <class T, class U, class Op>
53   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> >
54   {
55     mpz_class a(1);
56     signed int b = 3;
57     mpz_class c(a - b); ASSERT_ALWAYS(c == -2);
58   }
59   {
60     mpz_class a(-8);
61     unsigned int b = 2;
62     mpz_class c;
63     c = a / b; ASSERT_ALWAYS(c == -4);
64   }
65   {
66     mpz_class a(2);
67     double b = 3.0;
68     mpz_class c(a + b); ASSERT_ALWAYS(c == 5);
69   }
70   {
71     mpz_class a(4);
72     mpz_class b;
73     b = a + 0; ASSERT_ALWAYS(b == 4);
74   }
75 
76   // template <class T, class U, class Op>
77   // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> >
78   {
79     mpz_class a(3);
80     signed int b = 9;
81     mpz_class c(b / a); ASSERT_ALWAYS(c == 3);
82   }
83 
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
87 
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
91 
92   // template <class T, class U, class Op>
93   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> >
94   {
95     mpz_class a(3), b(4);
96     mpz_class c(a * (-b)); ASSERT_ALWAYS(c == -12);
97   }
98 
99   // template <class T, class U, class Op>
100   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> >
101   {
102     mpz_class a(3), b(2), c(1);
103     mpz_class d;
104     d = (a % b) + c; ASSERT_ALWAYS(d == 2);
105   }
106 
107   // template <class T, class U, class V, class Op>
108   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> >
109   {
110     mpz_class a(-5);
111     unsigned int b = 2;
112     mpz_class c((-a) << b); ASSERT_ALWAYS(c == 20);
113   }
114   {
115     mpz_class a(5), b(-4);
116     signed int c = 3;
117     mpz_class d;
118     d = (a * b) >> c; ASSERT_ALWAYS(d == -3);
119   }
120 
121   // template <class T, class U, class V, class Op>
122   // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> >
123   {
124     mpz_class a(2), b(4);
125     double c = 6;
126     mpz_class d(c / (a - b)); ASSERT_ALWAYS(d == -3);
127   }
128   {
129     mpz_class a(3), b(2);
130     double c = 1;
131     mpz_class d;
132     d = c + (a + b); ASSERT_ALWAYS(d == 6);
133   }
134 
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
138 
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
142 
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> >
145   {
146     mpz_class a(3), b(5), c(7);
147     mpz_class d;
148     d = (a - b) * (-c); ASSERT_ALWAYS(d == 14);
149   }
150 
151   {
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);
165 
166     c = a | 1267650600228229401496703205376.0; // 2^100
167     want = "0x1000000000000000000000cafe";
168     ASSERT_ALWAYS (c == want);
169   }
170 
171 }
172 
173 void
174 check_mpq (void)
175 {
176   // template <class T, class Op>
177   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> >
178   {
179     mpq_class a(1, 2), b(3, 4);
180     mpq_class c(a + b); ASSERT_ALWAYS(c == 1.25);
181   }
182 
183   // template <class T, class U, class Op>
184   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> >
185   {
186     mpq_class a(1, 2);
187     signed int b = 3;
188     mpq_class c(a - b); ASSERT_ALWAYS(c == -2.5);
189   }
190   {
191     mpq_class a(1, 2);
192     mpq_class b;
193     b = a + 0; ASSERT_ALWAYS(b == 0.5);
194   }
195 
196   // template <class T, class U, class Op>
197   // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> >
198   {
199     mpq_class a(2, 3);
200     signed int b = 4;
201     mpq_class c;
202     c = b / a; ASSERT_ALWAYS(c == 6);
203   }
204 
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> >
207   {
208     mpq_class a(1, 2);
209     mpz_class b(1);
210     mpq_class c(a + b); ASSERT_ALWAYS(c == 1.5);
211   }
212   {
213     mpq_class a(2, 3);
214     mpz_class b(1);
215     double c = 2.0;
216     mpq_class d;
217     d = a * (b + c); ASSERT_ALWAYS(d == 2);
218   }
219 
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> >
222   {
223     mpq_class a(2, 3);
224     mpz_class b(4);
225     mpq_class c(b / a); ASSERT_ALWAYS(c == 6);
226   }
227   {
228     mpq_class a(2, 3);
229     mpz_class b(1), c(4);
230     mpq_class d;
231     d = (b - c) * a; ASSERT_ALWAYS(d == -2);
232   }
233 
234   // template <class T, class U, class Op>
235   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> >
236   {
237     mpq_class a(1, 3), b(3, 4);
238     mpq_class c;
239     c = a * (-b); ASSERT_ALWAYS(c == -0.25);
240   }
241 
242   // template <class T, class U, class Op>
243   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> >
244   {
245     mpq_class a(1, 3), b(2, 3), c(1, 4);
246     mpq_class d((a / b) + c); ASSERT_ALWAYS(d == 0.75);
247   }
248 
249   // template <class T, class U, class V, class Op>
250   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> >
251   {
252     mpq_class a(3, 8);
253     unsigned int b = 4;
254     mpq_class c((-a) << b); ASSERT_ALWAYS(c == -6);
255   }
256 
257   // template <class T, class U, class V, class Op>
258   // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> >
259   {
260     mpq_class a(1, 2), b(1, 4);
261     double c = 6.0;
262     mpq_class d;
263     d = c / (a + b); ASSERT_ALWAYS(d == 8);
264   }
265 
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> >
268   {
269     mpq_class a(1, 2), b(1, 4);
270     mpz_class c(1);
271     mpq_class d((a + b) - c); ASSERT_ALWAYS(d == -0.25);
272   }
273   {
274     mpq_class a(1, 3), b(3, 2);
275     mpz_class c(2), d(4);
276     mpq_class e;
277     e = (a * b) / (c - d); ASSERT_ALWAYS(e == -0.25);
278   }
279 
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> >
282   {
283     mpq_class a(1, 3), b(3, 4);
284     mpz_class c(-3);
285     mpq_class d(c * (a * b)); ASSERT_ALWAYS(d == -0.75);
286   }
287   {
288     mpq_class a(1, 3), b(3, 5);
289     mpz_class c(6);
290     signed int d = 4;
291     mpq_class e;
292     e = (c % d) / (a * b); ASSERT_ALWAYS(e == 10);
293   }
294 
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> >
297   {
298     mpq_class a(1, 3), b(3, 4), c(2, 5);
299     mpq_class d;
300     d = (a * b) / (-c); ASSERT_ALWAYS(d == -0.625);
301   }
302 }
303 
304 void
305 check_mpf (void)
306 {
307   // template <class T, class Op>
308   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> >
309   {
310     mpf_class a(1), b(2);
311     mpf_class c(a + b); ASSERT_ALWAYS(c == 3);
312   }
313   {
314     mpf_class a(1.5), b(6);
315     mpf_class c;
316     c = a / b; ASSERT_ALWAYS(c == 0.25);
317   }
318 
319   // template <class T, class U, class Op>
320   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> >
321   {
322     mpf_class a(1);
323     signed int b = -2;
324     mpf_class c(a - b); ASSERT_ALWAYS(c == 3);
325   }
326   {
327     mpf_class a(2);
328     mpf_class b;
329     b = a + 0; ASSERT_ALWAYS(b == 2);
330   }
331 
332   // template <class T, class U, class Op>
333   // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> >
334   {
335     mpf_class a(2);
336     unsigned int b = 3;
337     mpf_class c;
338     c = b / a; ASSERT_ALWAYS(c == 1.5);
339   }
340 
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> >
343   {
344     mpf_class a(2);
345     mpz_class b(3);
346     mpf_class c(a - b); ASSERT_ALWAYS(c == -1);
347   }
348   {
349     mpf_class a(3);
350     mpz_class b(2), c(1);
351     mpf_class d;
352     d = a * (b + c); ASSERT_ALWAYS(d == 9);
353   }
354 
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> >
357   {
358     mpf_class a(6);
359     mpq_class b(3, 4);
360     mpf_class c(a * b); ASSERT_ALWAYS(c == 4.5);
361   }
362 
363   // template <class T, class U, class Op>
364   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> >
365   {
366     mpf_class a(2), b(-3);
367     mpf_class c;
368     c = a * (-b); ASSERT_ALWAYS(c == 6);
369   }
370 
371   // template <class T, class U, class Op>
372   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> >
373   {
374     mpf_class a(3), b(4), c(5);
375     mpf_class d;
376     d = (a / b) - c; ASSERT_ALWAYS(d == -4.25);
377   }
378 
379   // template <class T, class U, class V, class Op>
380   // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> >
381   {
382     mpf_class a(3);
383     unsigned int b = 2;
384     mpf_class c((-a) >> b); ASSERT_ALWAYS(c == -0.75);
385   }
386 
387   // template <class T, class U, class V, class Op>
388   // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> >
389   {
390     mpf_class a(2), b(3);
391     double c = 5.0;
392     mpf_class d;
393     d = c / (a + b); ASSERT_ALWAYS(d == 1);
394   }
395 
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> >
398   {
399     mpf_class a(2), b(3);
400     mpz_class c(4);
401     mpf_class d;
402     d = (a + b) * c; ASSERT_ALWAYS(d == 20);
403   }
404   {
405     mpf_class a(2), b(3);
406     mpq_class c(1, 2), d(1, 4);
407     mpf_class e;
408     e = (a * b) / (c + d); ASSERT_ALWAYS(e == 8);
409   }
410 
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> >
413   {
414     mpf_class a(1), b(2);
415     mpq_class c(3);
416     mpf_class d(c / (a + b)); ASSERT_ALWAYS(d == 1);
417   }
418   {
419     mpf_class a(1);
420     mpz_class b(2);
421     mpq_class c(3, 4);
422     mpf_class d;
423     d = (-c) + (a + b); ASSERT_ALWAYS(d == 2.25);
424   }
425 
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> >
428   {
429     mpf_class a(1), b(2), c(3);
430     mpf_class d;
431     d = (a + b) * (-c); ASSERT_ALWAYS(d == -9);
432   }
433 }
434 
435 
436 int
437 main (void)
438 {
439   tests_start();
440 
441   check_mpz();
442   check_mpq();
443   check_mpf();
444 
445   tests_end();
446   return 0;
447 }
448