xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tcmpabs.c (revision ba125506a622fe649968631a56eba5d42ff57863)
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