xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tisnan.c (revision dd75ac5b443e967e26b4d18cc8cd5eb98512bfbf)
1 /* Test file for mpfr_nan_p, mpfr_inf_p, mpfr_number_p, mpfr_zero_p and
2    mpfr_regular_p.
3 
4 Copyright 2001-2004, 2006-2023 Free Software Foundation, Inc.
5 Contributed by the AriC and Caramba projects, INRIA.
6 
7 This file is part of the GNU MPFR Library.
8 
9 The GNU MPFR Library is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or (at your
12 option) any later version.
13 
14 The GNU MPFR Library is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
17 License for more details.
18 
19 You should have received a copy of the GNU Lesser General Public License
20 along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
21 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
22 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
23 
24 #include "mpfr-test.h"
25 
26 int
27 main (void)
28 {
29   mpfr_t  x;
30   int i = 0, j = 0;
31 
32   /* We need to check that when the function is implemented by a macro,
33      it behaves correctly. */
34 #define ARG     (i++, VOIDP_CAST(x))
35 #define CHECK   MPFR_ASSERTN (i == ++j)
36 
37   tests_start_mpfr ();
38 
39   mpfr_init (x);
40 
41 #if 0
42   /* The following should yield a compilation error when the functions
43      are implemented as macros. Change 0 to 1 above in order to test. */
44   (void) (mpfr_nan_p (1L));
45   (void) (mpfr_inf_p (1L));
46   (void) (mpfr_number_p (1L));
47   (void) (mpfr_zero_p (1L));
48   (void) (mpfr_regular_p (1L));
49 #endif
50 
51 #ifdef IGNORE_CPP_COMPAT
52 #pragma GCC diagnostic push
53 #pragma GCC diagnostic ignored "-Wc++-compat"
54 #endif
55 
56   /* check +infinity gives non-zero for mpfr_inf_p only */
57   mpfr_set_ui (x, 1L, MPFR_RNDZ);
58   mpfr_div_ui (x, x, 0L, MPFR_RNDZ);
59   if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG))
60     {
61       printf ("Error: mpfr_nan_p(+Inf) gives non-zero\n");
62       exit (1);
63     }
64   CHECK;
65   if (!mpfr_inf_p (x) || !(mpfr_inf_p) (x) || !mpfr_inf_p (ARG))
66     {
67       printf ("Error: mpfr_inf_p(+Inf) gives zero\n");
68       exit (1);
69     }
70   CHECK;
71   if (mpfr_number_p (x) || (mpfr_number_p) (x) || mpfr_number_p (ARG))
72     {
73       printf ("Error: mpfr_number_p(+Inf) gives non-zero\n");
74       exit (1);
75     }
76   CHECK;
77   if (mpfr_zero_p (x) || (mpfr_zero_p) (x) || mpfr_zero_p (ARG))
78     {
79       printf ("Error: mpfr_zero_p(+Inf) gives non-zero\n");
80       exit (1);
81     }
82   CHECK;
83   if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG))
84     {
85       printf ("Error: mpfr_regular_p(+Inf) gives non-zero\n");
86       exit (1);
87     }
88   CHECK;
89 
90   /* same for -Inf */
91   mpfr_neg (x, x, MPFR_RNDN);
92   if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG))
93     {
94       printf ("Error: mpfr_nan_p(-Inf) gives non-zero\n");
95       exit (1);
96     }
97   CHECK;
98   if (!mpfr_inf_p (x) || !(mpfr_inf_p) (x) || !mpfr_inf_p (ARG))
99     {
100       printf ("Error: mpfr_inf_p(-Inf) gives zero\n");
101       exit (1);
102     }
103   CHECK;
104   if (mpfr_number_p (x) || (mpfr_number_p) (x) || mpfr_number_p (ARG))
105     {
106       printf ("Error: mpfr_number_p(-Inf) gives non-zero\n");
107       exit (1);
108     }
109   CHECK;
110   if (mpfr_zero_p (x) || (mpfr_zero_p) (x) || mpfr_zero_p (ARG))
111     {
112       printf ("Error: mpfr_zero_p(-Inf) gives non-zero\n");
113       exit (1);
114     }
115   CHECK;
116   if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG))
117     {
118       printf ("Error: mpfr_regular_p(-Inf) gives non-zero\n");
119       exit (1);
120     }
121   CHECK;
122 
123   /* same for NaN */
124   mpfr_sub (x, x, x, MPFR_RNDN);
125   if (!mpfr_nan_p (x) || !(mpfr_nan_p) (x) || !mpfr_nan_p (ARG))
126     {
127       printf ("Error: mpfr_nan_p(NaN) gives zero\n");
128       exit (1);
129     }
130   CHECK;
131   if (mpfr_inf_p (x) || (mpfr_inf_p) (x) || mpfr_inf_p (ARG))
132     {
133       printf ("Error: mpfr_inf_p(NaN) gives non-zero\n");
134       exit (1);
135     }
136   CHECK;
137   if (mpfr_number_p (x) || (mpfr_number_p) (x) || mpfr_number_p (ARG))
138     {
139       printf ("Error: mpfr_number_p(NaN) gives non-zero\n");
140       exit (1);
141     }
142   CHECK;
143   if (mpfr_zero_p (x) || (mpfr_zero_p) (x) || mpfr_zero_p (ARG))
144     {
145       printf ("Error: mpfr_number_p(NaN) gives non-zero\n");
146       exit (1);
147     }
148   CHECK;
149   if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG))
150     {
151       printf ("Error: mpfr_regular_p(NaN) gives non-zero\n");
152       exit (1);
153     }
154   CHECK;
155 
156   /* same for a regular number */
157   mpfr_set_ui (x, 1, MPFR_RNDN);
158   if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG))
159     {
160       printf ("Error: mpfr_nan_p(1) gives non-zero\n");
161       exit (1);
162     }
163   CHECK;
164   if (mpfr_inf_p (x) || (mpfr_inf_p) (x) || mpfr_inf_p (ARG))
165     {
166       printf ("Error: mpfr_inf_p(1) gives non-zero\n");
167       exit (1);
168     }
169   CHECK;
170   if (!mpfr_number_p (x) || !(mpfr_number_p) (x) || !mpfr_number_p (ARG))
171     {
172       printf ("Error: mpfr_number_p(1) gives zero\n");
173       exit (1);
174     }
175   CHECK;
176   if (mpfr_zero_p (x) || (mpfr_zero_p) (x) || mpfr_zero_p (ARG))
177     {
178       printf ("Error: mpfr_zero_p(1) gives non-zero\n");
179       exit (1);
180     }
181   CHECK;
182   if (!mpfr_regular_p (x) || !(mpfr_regular_p) (x) || !mpfr_regular_p (ARG))
183     {
184       printf ("Error: mpfr_regular_p(1) gives zero\n");
185       exit (1);
186     }
187   CHECK;
188 
189   /* Same for +0 */
190   mpfr_set_ui (x, 0, MPFR_RNDN);
191   if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG))
192     {
193       printf ("Error: mpfr_nan_p(+0) gives non-zero\n");
194       exit (1);
195     }
196   CHECK;
197   if (mpfr_inf_p (x) || (mpfr_inf_p) (x) || mpfr_inf_p (ARG))
198     {
199       printf ("Error: mpfr_inf_p(+0) gives non-zero\n");
200       exit (1);
201     }
202   CHECK;
203   if (!mpfr_number_p (x) || !(mpfr_number_p) (x) || !mpfr_number_p (ARG))
204     {
205       printf ("Error: mpfr_number_p(+0) gives zero\n");
206       exit (1);
207     }
208   CHECK;
209   if (!mpfr_zero_p (x) || !(mpfr_zero_p) (x) || !mpfr_zero_p (ARG))
210     {
211       printf ("Error: mpfr_zero_p(+0) gives zero\n");
212       exit (1);
213     }
214   CHECK;
215   if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG))
216     {
217       printf ("Error: mpfr_regular_p(+0) gives non-zero\n");
218       exit (1);
219     }
220   CHECK;
221 
222   /* Same for -0 */
223   mpfr_set_ui (x, 0, MPFR_RNDN);
224   mpfr_neg (x, x, MPFR_RNDN);
225   if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG))
226     {
227       printf ("Error: mpfr_nan_p(-0) gives non-zero\n");
228       exit (1);
229     }
230   CHECK;
231   if (mpfr_inf_p (x) || (mpfr_inf_p) (x) || mpfr_inf_p (ARG))
232     {
233       printf ("Error: mpfr_inf_p(-0) gives non-zero\n");
234       exit (1);
235     }
236   CHECK;
237   if (!mpfr_number_p (x) || !(mpfr_number_p) (x) || !mpfr_number_p (ARG))
238     {
239       printf ("Error: mpfr_number_p(-0) gives zero\n");
240       exit (1);
241     }
242   CHECK;
243   if (!mpfr_zero_p (x) || !(mpfr_zero_p) (x) || !mpfr_zero_p (ARG))
244     {
245       printf ("Error: mpfr_zero_p(-0) gives zero\n");
246       exit (1);
247     }
248   CHECK;
249   if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG))
250     {
251       printf ("Error: mpfr_regular_p(-0) gives non-zero\n");
252       exit (1);
253     }
254   CHECK;
255 
256 #ifdef IGNORE_CPP_COMPAT
257 #pragma GCC diagnostic pop
258 #endif
259 
260   mpfr_clear (x);
261 
262   tests_end_mpfr ();
263   return 0;
264 }
265