source: trunk/third/gmp/tests/cxx/t-expr.cc @ 18191

Revision 18191, 11.8 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18190, which included commits to RCS files with non-trunk default branches.
Line 
1/* Test mp*_class arithmetic expressions.
2
3Copyright 2001 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 2.1 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; see the file COPYING.LIB.  If not, write to
19the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20MA 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
31using 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
70void
71check_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
170void
171check_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
270void
271check_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
371int
372main (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}
Note: See TracBrowser for help on using the repository browser.