xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tcmp_ui.c (revision ba125506a622fe649968631a56eba5d42ff57863)
1 /* Test file for mpfr_cmp_ui and mpfr_cmp_si.
2 
3 Copyright 1999, 2001-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 #ifdef TCMP_UI_CHECK_NAN
24 
25 mpfr_clear_erangeflag ();
26 c = mpfr_cmp_si (x, TCMP_UI_CHECK_NAN);
27 if (c != 0 || !mpfr_erangeflag_p ())
28   {
29     printf ("NaN error on %d (1)\n", TCMP_UI_CHECK_NAN);
30     exit (1);
31   }
32 mpfr_clear_erangeflag ();
33 c = (mpfr_cmp_si) (x, TCMP_UI_CHECK_NAN);
34 if (c != 0 || !mpfr_erangeflag_p ())
35   {
36     printf ("NaN error on %d (2)\n", TCMP_UI_CHECK_NAN);
37     exit (1);
38   }
39 if (TCMP_UI_CHECK_NAN >= 0)
40   {
41     mpfr_clear_erangeflag ();
42     c = mpfr_cmp_ui (x, TCMP_UI_CHECK_NAN);
43     if (c != 0 || !mpfr_erangeflag_p ())
44       {
45         printf ("NaN error on %d (3)\n", TCMP_UI_CHECK_NAN);
46         exit (1);
47       }
48     mpfr_clear_erangeflag ();
49     c = (mpfr_cmp_ui) (x, TCMP_UI_CHECK_NAN);
50     if (c != 0 || !mpfr_erangeflag_p ())
51       {
52         printf ("NaN error on %d (4)\n", TCMP_UI_CHECK_NAN);
53         exit (1);
54       }
55   }
56 
57 #else
58 
59 #include "mpfr-test.h"
60 
61 static void
check_nan(void)62 check_nan (void)
63 {
64   mpfr_t x;
65   int c, i;
66 
67   mpfr_init (x);
68   mpfr_set_nan (x);
69   /* We need constants to completely test the macros. */
70 #undef TCMP_UI_CHECK_NAN
71 #define TCMP_UI_CHECK_NAN -17
72 #include "tcmp_ui.c"
73 #undef TCMP_UI_CHECK_NAN
74 #define TCMP_UI_CHECK_NAN 0
75 #include "tcmp_ui.c"
76 #undef TCMP_UI_CHECK_NAN
77 #define TCMP_UI_CHECK_NAN 17
78 #include "tcmp_ui.c"
79   for (i = -17; i <= 17; i += 17)
80     {
81 #undef TCMP_UI_CHECK_NAN
82 #define TCMP_UI_CHECK_NAN i
83 #include "tcmp_ui.c"
84     }
85   mpfr_clear (x);
86 }
87 
88 /* Since mpfr_cmp_ui and mpfr_cmp_si are also implemented by a macro
89    with __builtin_constant_p for GCC, check that side effects are
90    handled correctly. */
91 static void
check_macros(void)92 check_macros (void)
93 {
94   mpfr_t x;
95   int c;
96 
97   mpfr_init2 (x, 32);
98 
99   c = 0;
100   mpfr_set_ui (x, 17, MPFR_RNDN);
101   if (mpfr_cmp_ui (x, 17) != 0)
102     {
103       printf ("Error 1 on mpfr_cmp_ui(x,17) in check_macros\n");
104       exit (1);
105     }
106   if (mpfr_cmp_ui (x, (c++, 17)) != 0)
107     {
108       printf ("Error 2 on mpfr_cmp_ui(x,17) in check_macros\n");
109       exit (1);
110     }
111   if (c != 1)
112     {
113       /* Failure in r13626 on x86_64 with the clang-9 1:9-1 Debian package,
114          with any optimization level: c = 2 instead of 1
115          Bug report: https://bugs.llvm.org/show_bug.cgi?id=43557
116          New URL: https://github.com/llvm/llvm-project/issues/42902
117          Apparently fixed in the clang-9 1:9.0.1-12 Debian package. */
118       /* [2020-06-17]
119          If one adds tcc support for macros using __builtin_constant_p
120          in mpfr.h by testing __TINYC__, one also gets a failure.
121          Bug report: https://savannah.nongnu.org/bugs/?58606
122          "__builtin_constant_p is buggy on argument with side effect and
123          constant value" */
124       printf ("Error 3 on mpfr_cmp_ui(x,17) in check_macros\n"
125               "(c = %d instead of 1)\n", c);
126       exit (1);
127     }
128   if (mpfr_cmp_si (x, 17) != 0)
129     {
130       printf ("Error 1 on mpfr_cmp_si(x,17) in check_macros\n");
131       exit (1);
132     }
133   if (mpfr_cmp_si (x, (c++, 17)) != 0)
134     {
135       printf ("Error 2 on mpfr_cmp_si(x,17) in check_macros\n");
136       exit (1);
137     }
138   if (c != 2)
139     {
140       printf ("Error 3 on mpfr_cmp_si(x,17) in check_macros\n"
141               "(c = %d instead of 2)\n", c);
142       exit (1);
143     }
144 
145   c = 0;
146   mpfr_set_ui (x, 0, MPFR_RNDN);
147   if (mpfr_cmp_ui (x, 0) != 0)
148     {
149       printf ("Error 1 on mpfr_cmp_ui(x,0) in check_macros\n");
150       exit (1);
151     }
152   if (mpfr_cmp_ui (x, (c++, 0)) != 0)
153     {
154       printf ("Error 2 on mpfr_cmp_ui(x,0) in check_macros\n");
155       exit (1);
156     }
157   if (c != 1)
158     {
159       printf ("Error 3 on mpfr_cmp_ui(x,0) in check_macros\n"
160               "(c = %d instead of 1)\n", c);
161       exit (1);
162     }
163   if (mpfr_cmp_si (x, 0) != 0)
164     {
165       printf ("Error 1 on mpfr_cmp_si(x,0) in check_macros\n");
166       exit (1);
167     }
168   if (mpfr_cmp_si (x, (c++, 0)) != 0)
169     {
170       printf ("Error 2 on mpfr_cmp_si(x,0) in check_macros\n");
171       exit (1);
172     }
173   if (c != 2)
174     {
175       printf ("Error 3 on mpfr_cmp_si(x,0) in check_macros\n"
176               "(c = %d instead of 2)\n", c);
177       exit (1);
178     }
179 
180   mpfr_clear (x);
181 }
182 
183 /* Bug in r7114 */
184 static void
test_macros(void)185 test_macros (void)
186 {
187   mpfr_t x[3];
188   mpfr_ptr p;
189 
190   mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0);
191   mpfr_set_ui (x[0], 0, MPFR_RNDN);
192   p = x[0];
193   if (mpfr_cmp_ui (p++, 0) != 0)
194     {
195       printf ("Error in mpfr_cmp_ui macro: result should be 0.\n");
196       exit (1);
197     }
198   if (p != x[1])
199     {
200       printf ("Error in mpfr_cmp_ui macro: p - x[0] = %d (expecting 1)\n",
201               (int) (p - x[0]));
202       exit (1);
203     }
204   p = x[0];
205   if (mpfr_cmp_si (p++, 0) != 0)
206     {
207       printf ("Error in mpfr_cmp_si macro: result should be 0.\n");
208       exit (1);
209     }
210   if (p != x[1])
211     {
212       printf ("Error in mpfr_cmp_si macro: p - x[0] = %d (expecting 1)\n",
213               (int) (p - x[0]));
214       exit (1);
215     }
216   mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0);
217 }
218 
219 int
main(void)220 main (void)
221 {
222   mpfr_t x;
223   unsigned long i;
224   long s;
225 
226   tests_start_mpfr ();
227 
228   mpfr_init(x);
229 
230   /* tests for cmp_ui */
231   mpfr_set_ui (x, 3, MPFR_RNDZ);
232   if ((mpfr_cmp_ui) (x, i = 3) != 0)
233     {
234       printf ("Error in mpfr_cmp_ui(3.0, 3)\n");
235       exit (1);
236     }
237   if (mpfr_cmp_ui (x, i = 2) <= 0)
238     {
239       printf ("Error in mpfr_cmp_ui(3.0,2)\n");
240       exit (1);
241     }
242   if (mpfr_cmp_ui (x, i = 4) >= 0)
243     {
244       printf ("Error in mpfr_cmp_ui(3.0,4)\n");
245       exit (1);
246     }
247   mpfr_set_ui (x, 0, MPFR_RNDZ);
248   mpfr_neg (x, x, MPFR_RNDZ);
249   if (mpfr_cmp_ui (x, i = 0))
250     {
251       printf ("Error in mpfr_cmp_ui(0.0,0)\n");
252       exit (1);
253     }
254   mpfr_set_ui (x, 1, MPFR_RNDZ);
255   if (mpfr_cmp_ui (x, i = 0) == 0)
256     {
257       printf ("Error in mpfr_cmp_ui(1.0,0)\n");
258       exit (1);
259     }
260 
261   mpfr_set_inf (x, 1);
262   if (mpfr_cmp_ui (x, 1) <= 0)
263     {
264       printf ("Error in mpfr_cmp_ui (Inf, 0)\n");
265       exit (1);
266     }
267   mpfr_set_inf (x, -1);
268   if (mpfr_cmp_ui (x, 1) >= 0)
269     {
270       printf ("Error in mpfr_cmp_ui (-Inf, 0)\n");
271       exit (1);
272     }
273 
274   mpfr_set_si (x, -1, MPFR_RNDN);
275   MPFR_ASSERTN(mpfr_cmp_ui (x, 1) < 0);
276   MPFR_ASSERTN(mpfr_cmp_ui (x, 0) < 0);
277 
278   mpfr_set_ui (x, 1, MPFR_RNDN);
279   MPFR_ASSERTN(mpfr_cmp_ui (x, 0) > 0);
280 
281   /* tests for cmp_si */
282   (mpfr_set_si) (x, -3, MPFR_RNDZ);
283   if ((mpfr_cmp_si) (x, s = -3) != 0)
284     {
285       printf ("Error in mpfr_cmp_si(-3.0,-3)\n");
286       exit (1);
287     }
288   if (mpfr_cmp_si (x, s = -4) <= 0)
289     {
290       printf ("Error in mpfr_cmp_si(-3.0,-4)\n");
291       exit (1);
292     }
293   if (mpfr_cmp_si (x, s = 1) >= 0)
294     {
295       printf ("Error in mpfr_cmp_si(-3.0,1)\n");
296       exit (1);
297     }
298 
299   mpfr_set_inf (x, 1);
300   if (mpfr_cmp_si (x, -1) <= 0)
301     {
302       printf ("Error in mpfr_cmp_si (Inf, 0)\n");
303       exit (1);
304     }
305   mpfr_set_inf (x, -1);
306   if (mpfr_cmp_si (x, -1) >= 0)
307     {
308       printf ("Error in mpfr_cmp_si (-Inf, 0)\n");
309       exit (1);
310     }
311 
312   /* case b=0 */
313   mpfr_set_ui (x, 0, MPFR_RNDZ);
314   MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0);
315   MPFR_ASSERTN(mpfr_cmp_si (x, 1) < 0);
316   MPFR_ASSERTN(mpfr_cmp_si (x, -1) > 0);
317 
318   /* case i=0 */
319   mpfr_set_ui (x, 1, MPFR_RNDZ);
320   MPFR_ASSERTN(mpfr_cmp_si (x, 0) > 0);
321   mpfr_set_ui (x, 0, MPFR_RNDZ);
322   MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0);
323   mpfr_neg (x, x, MPFR_RNDZ);
324   MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0);
325   mpfr_set_si (x, -1, MPFR_RNDZ);
326   MPFR_ASSERTN(mpfr_cmp_si (x, 0) < 0);
327 
328   /* case large x */
329   mpfr_set_str_binary (x, "1E100");
330   MPFR_ASSERTN(mpfr_cmp_si (x, 0) > 0);
331   MPFR_ASSERTN(mpfr_cmp_si (x, 1) > 0);
332   MPFR_ASSERTN(mpfr_cmp_si (x, -1) > 0);
333   mpfr_set_str_binary (x, "-1E100");
334   MPFR_ASSERTN(mpfr_cmp_si (x, 0) < 0);
335   MPFR_ASSERTN(mpfr_cmp_si (x, 1) < 0);
336   MPFR_ASSERTN(mpfr_cmp_si (x, -1) < 0);
337 
338   /* corner case */
339   mpfr_set_ui (x, 1, MPFR_RNDZ);
340   mpfr_mul_2ui (x, x, GMP_NUMB_BITS - 1, MPFR_RNDZ);
341   /* now EXP(x)=GMP_NUMB_BITS */
342   MPFR_ASSERTN(mpfr_cmp_si (x, 1) > 0);
343 
344   mpfr_clear (x);
345 
346   check_nan ();
347   check_macros ();
348   test_macros ();
349 
350   tests_end_mpfr ();
351   return 0;
352 }
353 
354 #endif
355