Imported Upstream version 3.1.1
[platform/upstream/mpfr.git] / tests / tcmp_ui.c
1 /* Test file for mpfr_cmp_ui and mpfr_cmp_si.
2
3 Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramel 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 http://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 <stdio.h>
60 #include <stdlib.h>
61
62 #include "mpfr-test.h"
63
64 static void
65 check_nan (void)
66 {
67   mpfr_t x;
68   int c, i;
69
70   mpfr_init (x);
71   mpfr_set_nan (x);
72   /* We need constants to completely test the macros. */
73 #undef TCMP_UI_CHECK_NAN
74 #define TCMP_UI_CHECK_NAN -17
75 #include "tcmp_ui.c"
76 #undef TCMP_UI_CHECK_NAN
77 #define TCMP_UI_CHECK_NAN 0
78 #include "tcmp_ui.c"
79 #undef TCMP_UI_CHECK_NAN
80 #define TCMP_UI_CHECK_NAN 17
81 #include "tcmp_ui.c"
82   for (i = -17; i <= 17; i += 17)
83     {
84 #undef TCMP_UI_CHECK_NAN
85 #define TCMP_UI_CHECK_NAN i
86 #include "tcmp_ui.c"
87     }
88   mpfr_clear (x);
89 }
90
91 /* Since mpfr_cmp_ui and mpfr_cmp_si are also implemented by a macro
92    with __builtin_constant_p for GCC, check that side effects are
93    handled correctly. */
94 static void
95 check_macros (void)
96 {
97   mpfr_t x;
98   int c;
99
100   mpfr_init2 (x, 32);
101
102   c = 0;
103   mpfr_set_ui (x, 17, MPFR_RNDN);
104   if (mpfr_cmp_ui (x, 17) != 0)
105     {
106       printf ("Error 1 on mpfr_cmp_ui(x,17) in check_macros\n");
107       exit (1);
108     }
109   if (mpfr_cmp_ui (x, (c++, 17)) != 0)
110     {
111       printf ("Error 2 on mpfr_cmp_ui(x,17) in check_macros\n");
112       exit (1);
113     }
114   if (c != 1)
115     {
116       printf ("Error 3 on mpfr_cmp_ui(x,17) in check_macros\n"
117               "(c = %d instead of 1)\n", c);
118       exit (1);
119     }
120   if (mpfr_cmp_si (x, 17) != 0)
121     {
122       printf ("Error 1 on mpfr_cmp_si(x,17) in check_macros\n");
123       exit (1);
124     }
125   if (mpfr_cmp_si (x, (c++, 17)) != 0)
126     {
127       printf ("Error 2 on mpfr_cmp_si(x,17) in check_macros\n");
128       exit (1);
129     }
130   if (c != 2)
131     {
132       printf ("Error 3 on mpfr_cmp_si(x,17) in check_macros\n"
133               "(c = %d instead of 2)\n", c);
134       exit (1);
135     }
136
137   c = 0;
138   mpfr_set_ui (x, 0, MPFR_RNDN);
139   if (mpfr_cmp_ui (x, 0) != 0)
140     {
141       printf ("Error 1 on mpfr_cmp_ui(x,0) in check_macros\n");
142       exit (1);
143     }
144   if (mpfr_cmp_ui (x, (c++, 0)) != 0)
145     {
146       printf ("Error 2 on mpfr_cmp_ui(x,0) in check_macros\n");
147       exit (1);
148     }
149   if (c != 1)
150     {
151       printf ("Error 3 on mpfr_cmp_ui(x,0) in check_macros\n"
152               "(c = %d instead of 1)\n", c);
153       exit (1);
154     }
155   if (mpfr_cmp_si (x, 0) != 0)
156     {
157       printf ("Error 1 on mpfr_cmp_si(x,0) in check_macros\n");
158       exit (1);
159     }
160   if (mpfr_cmp_si (x, (c++, 0)) != 0)
161     {
162       printf ("Error 2 on mpfr_cmp_si(x,0) in check_macros\n");
163       exit (1);
164     }
165   if (c != 2)
166     {
167       printf ("Error 3 on mpfr_cmp_si(x,0) in check_macros\n"
168               "(c = %d instead of 2)\n", c);
169       exit (1);
170     }
171
172   mpfr_clear (x);
173 }
174
175 /* Bug in r7114 */
176 static void
177 test_macros (void)
178 {
179   mpfr_t x[3];
180   mpfr_ptr p;
181
182   mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0);
183   mpfr_set_ui (x[0], 0, MPFR_RNDN);
184   p = x[0];
185   if (mpfr_cmp_ui (p++, 0) != 0)
186     {
187       printf ("Error in mpfr_cmp_ui macro: result should be 0.\n");
188       exit (1);
189     }
190   if (p != x[1])
191     {
192       printf ("Error in mpfr_cmp_ui macro: p - x[0] = %d (expecting 1)\n",
193               (int) (p - x[0]));
194       exit (1);
195     }
196   p = x[0];
197   if (mpfr_cmp_si (p++, 0) != 0)
198     {
199       printf ("Error in mpfr_cmp_si macro: result should be 0.\n");
200       exit (1);
201     }
202   if (p != x[1])
203     {
204       printf ("Error in mpfr_cmp_si macro: p - x[0] = %d (expecting 1)\n",
205               (int) (p - x[0]));
206       exit (1);
207     }
208   mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0);
209 }
210
211 int
212 main (void)
213 {
214   mpfr_t x;
215   unsigned long i;
216   long s;
217
218   tests_start_mpfr ();
219
220   mpfr_init(x);
221
222   /* tests for cmp_ui */
223   mpfr_set_ui (x, 3, MPFR_RNDZ);
224   if ((mpfr_cmp_ui) (x, i = 3) != 0)
225     {
226       printf ("Error in mpfr_cmp_ui(3.0, 3)\n");
227       exit (1);
228     }
229   if (mpfr_cmp_ui (x, i = 2) <= 0)
230     {
231       printf ("Error in mpfr_cmp_ui(3.0,2)\n");
232       exit (1);
233     }
234   if (mpfr_cmp_ui (x, i = 4) >= 0)
235     {
236       printf ("Error in mpfr_cmp_ui(3.0,4)\n");
237       exit (1);
238     }
239   mpfr_set_ui (x, 0, MPFR_RNDZ);
240   mpfr_neg (x, x, MPFR_RNDZ);
241   if (mpfr_cmp_ui (x, i = 0))
242     {
243       printf ("Error in mpfr_cmp_ui(0.0,0)\n");
244       exit (1);
245     }
246   mpfr_set_ui (x, 1, MPFR_RNDZ);
247   if (mpfr_cmp_ui (x, i = 0) == 0)
248     {
249       printf ("Error in mpfr_cmp_ui(1.0,0)\n");
250       exit (1);
251     }
252
253   mpfr_set_inf (x, 1);
254   if (mpfr_cmp_ui (x, 1) <= 0)
255     {
256       printf ("Error in mpfr_cmp_ui (Inf, 0)\n");
257       exit (1);
258     }
259   mpfr_set_inf (x, -1);
260   if (mpfr_cmp_ui (x, 1) >= 0)
261     {
262       printf ("Error in mpfr_cmp_ui (-Inf, 0)\n");
263       exit (1);
264     }
265
266   mpfr_set_si (x, -1, MPFR_RNDN);
267   MPFR_ASSERTN(mpfr_cmp_ui (x, 1) < 0);
268   MPFR_ASSERTN(mpfr_cmp_ui (x, 0) < 0);
269
270   mpfr_set_ui (x, 1, MPFR_RNDN);
271   MPFR_ASSERTN(mpfr_cmp_ui (x, 0) > 0);
272
273   /* tests for cmp_si */
274   (mpfr_set_si) (x, -3, MPFR_RNDZ);
275   if ((mpfr_cmp_si) (x, s = -3) != 0)
276     {
277       printf ("Error in mpfr_cmp_si(-3.0,-3)\n");
278       exit (1);
279     }
280   if (mpfr_cmp_si (x, s = -4) <= 0)
281     {
282       printf ("Error in mpfr_cmp_si(-3.0,-4)\n");
283       exit (1);
284     }
285   if (mpfr_cmp_si (x, s = 1) >= 0)
286     {
287       printf ("Error in mpfr_cmp_si(-3.0,1)\n");
288       exit (1);
289     }
290
291   mpfr_set_inf (x, 1);
292   if (mpfr_cmp_si (x, -1) <= 0)
293     {
294       printf ("Error in mpfr_cmp_si (Inf, 0)\n");
295       exit (1);
296     }
297   mpfr_set_inf (x, -1);
298   if (mpfr_cmp_si (x, -1) >= 0)
299     {
300       printf ("Error in mpfr_cmp_si (-Inf, 0)\n");
301       exit (1);
302     }
303
304   /* case b=0 */
305   mpfr_set_ui (x, 0, MPFR_RNDZ);
306   MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0);
307   MPFR_ASSERTN(mpfr_cmp_si (x, 1) < 0);
308   MPFR_ASSERTN(mpfr_cmp_si (x, -1) > 0);
309
310   /* case i=0 */
311   mpfr_set_ui (x, 1, MPFR_RNDZ);
312   MPFR_ASSERTN(mpfr_cmp_si (x, 0) > 0);
313   mpfr_set_ui (x, 0, MPFR_RNDZ);
314   MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0);
315   mpfr_neg (x, x, MPFR_RNDZ);
316   MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0);
317   mpfr_set_si (x, -1, MPFR_RNDZ);
318   MPFR_ASSERTN(mpfr_cmp_si (x, 0) < 0);
319
320   /* case large x */
321   mpfr_set_str_binary (x, "1E100");
322   MPFR_ASSERTN(mpfr_cmp_si (x, 0) > 0);
323   MPFR_ASSERTN(mpfr_cmp_si (x, 1) > 0);
324   MPFR_ASSERTN(mpfr_cmp_si (x, -1) > 0);
325   mpfr_set_str_binary (x, "-1E100");
326   MPFR_ASSERTN(mpfr_cmp_si (x, 0) < 0);
327   MPFR_ASSERTN(mpfr_cmp_si (x, 1) < 0);
328   MPFR_ASSERTN(mpfr_cmp_si (x, -1) < 0);
329
330   /* corner case */
331   mpfr_set_ui (x, 1, MPFR_RNDZ);
332   mpfr_mul_2exp (x, x, GMP_NUMB_BITS - 1, MPFR_RNDZ);
333   /* now EXP(x)=GMP_NUMB_BITS */
334   MPFR_ASSERTN(mpfr_cmp_si (x, 1) > 0);
335
336   mpfr_clear (x);
337
338   check_nan ();
339   check_macros ();
340   test_macros ();
341
342   tests_end_mpfr ();
343   return 0;
344 }
345
346 #endif