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