t-aors.c revision 1.1.1.3 1 1.1 mrg /* Test mpq_add and mpq_sub.
2 1.1 mrg
3 1.1 mrg Copyright 2001 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1.1.2 mrg This file is part of the GNU MP Library test suite.
6 1.1 mrg
7 1.1.1.2 mrg The GNU MP Library test suite is free software; you can redistribute it
8 1.1.1.2 mrg and/or modify it under the terms of the GNU General Public License as
9 1.1.1.2 mrg published by the Free Software Foundation; either version 3 of the License,
10 1.1.1.2 mrg or (at your option) any later version.
11 1.1.1.2 mrg
12 1.1.1.2 mrg The GNU MP Library test suite is distributed in the hope that it will be
13 1.1.1.2 mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1.1.2 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 1.1.1.2 mrg Public License for more details.
16 1.1 mrg
17 1.1.1.2 mrg You should have received a copy of the GNU General Public License along with
18 1.1.1.3 mrg the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
19 1.1 mrg
20 1.1 mrg #include "config.h"
21 1.1 mrg
22 1.1 mrg #include <stdio.h>
23 1.1 mrg #include <stdlib.h>
24 1.1 mrg #include <string.h>
25 1.1 mrg
26 1.1 mrg #include "gmp.h"
27 1.1 mrg #include "gmp-impl.h"
28 1.1 mrg #include "tests.h"
29 1.1 mrg
30 1.1 mrg
31 1.1 mrg void
32 1.1 mrg check_all (mpq_ptr x, mpq_ptr y, mpq_ptr want_add, mpq_ptr want_sub)
33 1.1 mrg {
34 1.1 mrg mpq_t got;
35 1.1 mrg int neg_x, neg_y, swap;
36 1.1 mrg
37 1.1 mrg mpq_init (got);
38 1.1 mrg
39 1.1 mrg MPQ_CHECK_FORMAT (want_add);
40 1.1 mrg MPQ_CHECK_FORMAT (want_sub);
41 1.1 mrg MPQ_CHECK_FORMAT (x);
42 1.1 mrg MPQ_CHECK_FORMAT (y);
43 1.1 mrg
44 1.1 mrg for (swap = 0; swap <= 1; swap++)
45 1.1 mrg {
46 1.1 mrg for (neg_x = 0; neg_x <= 1; neg_x++)
47 1.1 mrg {
48 1.1 mrg for (neg_y = 0; neg_y <= 1; neg_y++)
49 1.1 mrg {
50 1.1 mrg mpq_add (got, x, y);
51 1.1 mrg MPQ_CHECK_FORMAT (got);
52 1.1 mrg if (! mpq_equal (got, want_add))
53 1.1 mrg {
54 1.1 mrg printf ("mpq_add wrong\n");
55 1.1 mrg mpq_trace (" x ", x);
56 1.1 mrg mpq_trace (" y ", y);
57 1.1 mrg mpq_trace (" got ", got);
58 1.1 mrg mpq_trace (" want", want_add);
59 1.1 mrg abort ();
60 1.1 mrg }
61 1.1 mrg
62 1.1 mrg mpq_sub (got, x, y);
63 1.1 mrg MPQ_CHECK_FORMAT (got);
64 1.1 mrg if (! mpq_equal (got, want_sub))
65 1.1 mrg {
66 1.1 mrg printf ("mpq_sub wrong\n");
67 1.1 mrg mpq_trace (" x ", x);
68 1.1 mrg mpq_trace (" y ", y);
69 1.1 mrg mpq_trace (" got ", got);
70 1.1 mrg mpq_trace (" want", want_sub);
71 1.1 mrg abort ();
72 1.1 mrg }
73 1.1 mrg
74 1.1 mrg
75 1.1 mrg mpq_neg (y, y);
76 1.1 mrg mpq_swap (want_add, want_sub);
77 1.1 mrg }
78 1.1 mrg
79 1.1 mrg mpq_neg (x, x);
80 1.1 mrg mpq_swap (want_add, want_sub);
81 1.1 mrg mpq_neg (want_add, want_add);
82 1.1 mrg mpq_neg (want_sub, want_sub);
83 1.1 mrg }
84 1.1 mrg
85 1.1 mrg mpq_swap (x, y);
86 1.1 mrg mpq_neg (want_sub, want_sub);
87 1.1 mrg }
88 1.1 mrg
89 1.1 mrg mpq_clear (got);
90 1.1 mrg }
91 1.1 mrg
92 1.1 mrg
93 1.1 mrg void
94 1.1 mrg check_data (void)
95 1.1 mrg {
96 1.1 mrg static const struct {
97 1.1 mrg const char *x;
98 1.1 mrg const char *y;
99 1.1 mrg const char *want_add;
100 1.1 mrg const char *want_sub;
101 1.1 mrg
102 1.1 mrg } data[] = {
103 1.1 mrg
104 1.1 mrg { "0", "0", "0", "0" },
105 1.1 mrg { "1", "0", "1", "1" },
106 1.1 mrg { "1", "1", "2", "0" },
107 1.1 mrg
108 1.1 mrg { "1/2", "1/2", "1", "0" },
109 1.1 mrg { "5/6", "14/15", "53/30", "-1/10" },
110 1.1 mrg };
111 1.1 mrg
112 1.1 mrg mpq_t x, y, want_add, want_sub;
113 1.1 mrg int i;
114 1.1 mrg
115 1.1 mrg mpq_init (x);
116 1.1 mrg mpq_init (y);
117 1.1 mrg mpq_init (want_add);
118 1.1 mrg mpq_init (want_sub);
119 1.1 mrg
120 1.1 mrg for (i = 0; i < numberof (data); i++)
121 1.1 mrg {
122 1.1 mrg mpq_set_str_or_abort (x, data[i].x, 0);
123 1.1 mrg mpq_set_str_or_abort (y, data[i].y, 0);
124 1.1 mrg mpq_set_str_or_abort (want_add, data[i].want_add, 0);
125 1.1 mrg mpq_set_str_or_abort (want_sub, data[i].want_sub, 0);
126 1.1 mrg
127 1.1 mrg check_all (x, y, want_add, want_sub);
128 1.1 mrg }
129 1.1 mrg
130 1.1 mrg mpq_clear (x);
131 1.1 mrg mpq_clear (y);
132 1.1 mrg mpq_clear (want_add);
133 1.1 mrg mpq_clear (want_sub);
134 1.1 mrg }
135 1.1 mrg
136 1.1 mrg
137 1.1 mrg void
138 1.1 mrg check_rand (void)
139 1.1 mrg {
140 1.1 mrg mpq_t x, y, want_add, want_sub;
141 1.1 mrg int i;
142 1.1 mrg gmp_randstate_ptr rands = RANDS;
143 1.1 mrg
144 1.1 mrg mpq_init (x);
145 1.1 mrg mpq_init (y);
146 1.1 mrg mpq_init (want_add);
147 1.1 mrg mpq_init (want_sub);
148 1.1 mrg
149 1.1 mrg for (i = 0; i < 500; i++)
150 1.1 mrg {
151 1.1 mrg mpz_errandomb (mpq_numref(x), rands, 512L);
152 1.1 mrg mpz_errandomb_nonzero (mpq_denref(x), rands, 512L);
153 1.1 mrg mpq_canonicalize (x);
154 1.1 mrg
155 1.1 mrg mpz_errandomb (mpq_numref(y), rands, 512L);
156 1.1 mrg mpz_errandomb_nonzero (mpq_denref(y), rands, 512L);
157 1.1 mrg mpq_canonicalize (y);
158 1.1 mrg
159 1.1 mrg refmpq_add (want_add, x, y);
160 1.1 mrg refmpq_sub (want_sub, x, y);
161 1.1 mrg
162 1.1 mrg check_all (x, y, want_add, want_sub);
163 1.1 mrg }
164 1.1 mrg
165 1.1 mrg mpq_clear (x);
166 1.1 mrg mpq_clear (y);
167 1.1 mrg mpq_clear (want_add);
168 1.1 mrg mpq_clear (want_sub);
169 1.1 mrg }
170 1.1 mrg
171 1.1 mrg
172 1.1 mrg int
173 1.1 mrg main (void)
174 1.1 mrg {
175 1.1 mrg tests_start ();
176 1.1 mrg
177 1.1 mrg check_data ();
178 1.1 mrg check_rand ();
179 1.1 mrg
180 1.1 mrg tests_end ();
181 1.1 mrg
182 1.1 mrg exit (0);
183 1.1 mrg }
184