1 /* Test file for mpfr_cmpabs and mpfr_cmpabs_ui.
2
3 Copyright 2004-2023 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramba projects, INRIA.
5
6 This file is part of the GNU MPFR Library.
7
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22
23 #include "mpfr-test.h"
24
25 #define PRINT_ERROR(s) do { printf ("Error: %s\n", s); exit (1); } while (0)
26
27 static int
cmpabs(mpfr_srcptr x,mpfr_srcptr y)28 cmpabs (mpfr_srcptr x, mpfr_srcptr y)
29 {
30 unsigned int i;
31 int r[4];
32 mpfr_flags_t f1, f2, flags[2] = { 0, MPFR_FLAGS_ALL };
33 mpfr_exp_t emin, emax;
34
35 emin = mpfr_get_emin ();
36 emax = mpfr_get_emax ();
37
38 for (i = 0; i < 4; i++)
39 {
40 if (i & 2)
41 {
42 mpfr_exp_t ex = MPFR_IS_SINGULAR (x) ? emax : MPFR_GET_EXP (x);
43 mpfr_exp_t ey = MPFR_IS_SINGULAR (y) ? emax : MPFR_GET_EXP (y);
44 set_emin (ex < ey ? ex : ey);
45 set_emax (ex < ey ? ey : ex);
46 }
47
48 __gmpfr_flags = f1 = flags[i % 2];
49 r[i] = mpfr_cmpabs (x, y);
50 f2 = __gmpfr_flags;
51 if (MPFR_IS_NAN (x) || MPFR_IS_NAN (y))
52 f1 |= MPFR_FLAGS_ERANGE;
53
54 if (i & 2)
55 {
56 set_emin (emin);
57 set_emax (emax);
58 }
59
60 if (f1 != f2)
61 {
62 printf ("Flags error in mpfr_cmpabs for i = %u\n x = ", i);
63 mpfr_dump (x);
64 printf (" y = ");
65 mpfr_dump (y);
66 printf ("Expected flags = ");
67 flags_out (f1);
68 printf ("Obtained flags = ");
69 flags_out (f2);
70 exit (1);
71 }
72
73 if (i > 0)
74 MPFR_ASSERTN (r[i] == r[0]);
75 }
76
77 return r[0];
78 }
79
80 static void
test_cmpabs(void)81 test_cmpabs (void)
82 {
83 mpfr_t xx, yy;
84
85 mpfr_init2 (xx, 2);
86 mpfr_init2 (yy, 2);
87
88 mpfr_clear_erangeflag ();
89 MPFR_SET_NAN (xx);
90 MPFR_SET_NAN (yy);
91 if (cmpabs (xx, yy) != 0)
92 PRINT_ERROR ("mpfr_cmpabs (NAN,NAN) returns non-zero");
93 if (!mpfr_erangeflag_p ())
94 PRINT_ERROR ("mpfr_cmpabs (NAN,NAN) doesn't set erange flag");
95
96 mpfr_set_si (yy, -1, MPFR_RNDN);
97 if (cmpabs (xx, yy) != 0)
98 PRINT_ERROR ("mpfr_cmpabs (NAN,-1) returns non-zero");
99 if (cmpabs (yy, xx) != 0)
100 PRINT_ERROR ("mpfr_cmpabs (-1,NAN) returns non-zero");
101
102 mpfr_set_str_binary (xx, "0.10E0");
103 mpfr_set_str_binary (yy, "-0.10E0");
104 if (cmpabs (xx, yy) != 0)
105 PRINT_ERROR ("mpfr_cmpabs (xx, yy) returns non-zero for prec=2");
106
107 mpfr_set_prec (xx, 65);
108 mpfr_set_prec (yy, 65);
109 mpfr_set_str_binary (xx, "-0.10011010101000110101010000000011001001001110001011101011111011101E623");
110 mpfr_set_str_binary (yy, "0.10011010101000110101010000000011001001001110001011101011111011100E623");
111 if (cmpabs (xx, yy) <= 0)
112 PRINT_ERROR ("Error (1) in mpfr_cmpabs");
113
114 mpfr_set_str_binary (xx, "-0.10100010001110110111000010001000010011111101000100011101000011100");
115 mpfr_set_str_binary (yy, "-0.10100010001110110111000010001000010011111101000100011101000011011");
116 if (cmpabs (xx, yy) <= 0)
117 PRINT_ERROR ("Error (2) in mpfr_cmpabs");
118
119 mpfr_set_prec (xx, 160);
120 mpfr_set_prec (yy, 160);
121 mpfr_set_str_binary (xx, "0.1E1");
122 mpfr_set_str_binary (yy, "-0.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000110001110100");
123 if (cmpabs (xx, yy) <= 0)
124 PRINT_ERROR ("Error (3) in mpfr_cmpabs");
125
126 mpfr_set_prec(xx, 53);
127 mpfr_set_prec(yy, 200);
128 mpfr_set_ui (xx, 1, (mpfr_rnd_t) 0);
129 mpfr_set_ui (yy, 1, (mpfr_rnd_t) 0);
130 if (cmpabs (xx, yy) != 0)
131 PRINT_ERROR ("Error in mpfr_cmpabs: 1.0 != 1.0");
132
133 mpfr_set_prec (yy, 31);
134 mpfr_set_str (xx, "-1.0000000002", 10, (mpfr_rnd_t) 0);
135 mpfr_set_ui (yy, 1, (mpfr_rnd_t) 0);
136 if (cmpabs (xx, yy) <= 0)
137 PRINT_ERROR ("Error in mpfr_cmpabs: not 1.0000000002 > 1.0");
138 mpfr_set_prec(yy, 53);
139
140 mpfr_set_ui(xx, 0, MPFR_RNDN);
141 mpfr_set_str (yy, "-0.1", 10, MPFR_RNDN);
142 if (cmpabs (xx, yy) >= 0)
143 PRINT_ERROR ("Error in mpfr_cmpabs(0.0, 0.1)");
144
145 mpfr_set_inf (xx, -1);
146 mpfr_set_str (yy, "23489745.0329", 10, MPFR_RNDN);
147 if (cmpabs (xx, yy) <= 0)
148 PRINT_ERROR ("Error in mpfr_cmpabs(-Inf, 23489745.0329)");
149
150 mpfr_set_inf (xx, 1);
151 mpfr_set_inf (yy, -1);
152 if (cmpabs (xx, yy) != 0)
153 PRINT_ERROR ("Error in mpfr_cmpabs(Inf, -Inf)");
154
155 mpfr_set_inf (yy, -1);
156 mpfr_set_str (xx, "2346.09234", 10, MPFR_RNDN);
157 if (cmpabs (xx, yy) >= 0)
158 PRINT_ERROR ("Error in mpfr_cmpabs(-Inf, 2346.09234)");
159
160 mpfr_set_prec (xx, 2);
161 mpfr_set_prec (yy, 128);
162 mpfr_set_str_binary (xx, "0.1E10");
163 mpfr_set_str_binary (yy,
164 "0.100000000000000000000000000000000000000000000000"
165 "00000000000000000000000000000000000000000000001E10");
166 if (cmpabs (xx, yy) >= 0)
167 PRINT_ERROR ("Error in mpfr_cmpabs(10.235, 2346.09234)");
168 mpfr_swap (xx, yy);
169 if (cmpabs (xx, yy) <= 0)
170 PRINT_ERROR ("Error in mpfr_cmpabs(2346.09234, 10.235)");
171 mpfr_swap (xx, yy);
172
173 mpfr_clear (xx);
174 mpfr_clear (yy);
175 }
176
177 static int
cmpabs_ui(mpfr_srcptr x,unsigned long u)178 cmpabs_ui (mpfr_srcptr x, unsigned long u)
179 {
180 unsigned int i;
181 int r[4];
182 mpfr_flags_t f1, f2, flags[2] = { 0, MPFR_FLAGS_ALL };
183 mpfr_exp_t emin, emax;
184
185 emin = mpfr_get_emin ();
186 emax = mpfr_get_emax ();
187
188 for (i = 0; i < 4; i++)
189 {
190 if (i & 2)
191 {
192 mpfr_exp_t e = MPFR_IS_SINGULAR (x) ? emax : MPFR_GET_EXP (x);
193 set_emin (e);
194 set_emax (e);
195 }
196
197 __gmpfr_flags = f1 = flags[i % 2];
198 r[i] = mpfr_cmpabs_ui (x, u);
199 f2 = __gmpfr_flags;
200 if (MPFR_IS_NAN (x))
201 f1 |= MPFR_FLAGS_ERANGE;
202
203 if (i & 2)
204 {
205 set_emin (emin);
206 set_emax (emax);
207 }
208
209 if (f1 != f2)
210 {
211 printf ("Flags error in mpfr_cmpabs_ui for i = %u\n x = ", i);
212 mpfr_dump (x);
213 printf (" u = %lu\n", u);
214 printf ("Expected flags = ");
215 flags_out (f1);
216 printf ("Obtained flags = ");
217 flags_out (f2);
218 exit (1);
219 }
220
221 if (i > 0)
222 MPFR_ASSERTN (r[i] == r[0]);
223 }
224
225 return r[0];
226 }
227
228 static void
test_cmpabs_ui(void)229 test_cmpabs_ui (void)
230 {
231 mpfr_t x;
232
233 mpfr_init2 (x, 64); /* should be enough so that ULONG_MAX fits */
234 /* check NaN */
235 mpfr_set_nan (x);
236 if (cmpabs_ui (x, 17) != 0)
237 PRINT_ERROR ("mpfr_cmpabs_ui (NaN, 17)");
238 /* check -Inf */
239 mpfr_set_inf (x, -1);
240 if (cmpabs_ui (x, 17) <= 0)
241 PRINT_ERROR ("mpfr_cmpabs_ui (-Inf, 17)");
242 /* check +Inf */
243 mpfr_set_inf (x, +1);
244 if (cmpabs_ui (x, 17) <= 0)
245 PRINT_ERROR ("mpfr_cmpabs_ui (+Inf, 17)");
246 /* check -1 */
247 mpfr_set_si (x, -1, MPFR_RNDN);
248 if (cmpabs_ui (x, 0) <= 0)
249 PRINT_ERROR ("mpfr_cmpabs_ui (-1, 0)");
250 if (cmpabs_ui (x, 17) >= 0)
251 PRINT_ERROR ("mpfr_cmpabs_ui (-1, 17)");
252 /* check -0 */
253 mpfr_set_zero (x, -1);
254 if (cmpabs_ui (x, 0) != 0)
255 PRINT_ERROR ("mpfr_cmpabs_ui (-0, 0)");
256 if (cmpabs_ui (x, 17) >= 0)
257 PRINT_ERROR ("mpfr_cmpabs_ui (-0, 17)");
258 /* check +0 */
259 mpfr_set_zero (x, +1);
260 if (cmpabs_ui (x, 0) != 0)
261 PRINT_ERROR ("mpfr_cmpabs_ui (+0, 0)");
262 if (cmpabs_ui (x, 17) >= 0)
263 PRINT_ERROR ("mpfr_cmpabs_ui (+0, 17)");
264 /* check 1 */
265 mpfr_set_ui (x, 1, MPFR_RNDN);
266 if (cmpabs_ui (x, 0) <= 0)
267 PRINT_ERROR ("mpfr_cmpabs_ui (1, 0)");
268 if (cmpabs_ui (x, 1) != 0)
269 PRINT_ERROR ("mpfr_cmpabs_ui (1, 1)");
270 if (cmpabs_ui (x, 17) >= 0)
271 PRINT_ERROR ("mpfr_cmpabs_ui (1, 17)");
272 /* check ULONG_MAX */
273 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
274 if (cmpabs_ui (x, 0) <= 0)
275 PRINT_ERROR ("mpfr_cmpabs_ui (ULONG_MAX, 0)");
276 if (cmpabs_ui (x, 1) <= 0)
277 PRINT_ERROR ("mpfr_cmpabs_ui (ULONG_MAX, 1)");
278 if (cmpabs_ui (x, 17) <= 0)
279 PRINT_ERROR ("mpfr_cmpabs_ui (ULONG_MAX, 17)");
280 if (cmpabs_ui (x, ULONG_MAX) != 0)
281 PRINT_ERROR ("mpfr_cmpabs_ui (ULONG_MAX, ULONG_MAX)");
282 mpfr_clear (x);
283 }
284
285 int
main(void)286 main (void)
287 {
288 tests_start_mpfr ();
289
290 test_cmpabs ();
291 test_cmpabs_ui ();
292
293 tests_end_mpfr ();
294 return 0;
295 }
296