1 /* Test file for:
2 mpfr_fits_sint_p, mpfr_fits_slong_p, mpfr_fits_sshort_p,
3 mpfr_fits_uint_p, mpfr_fits_ulong_p, mpfr_fits_ushort_p
4
5 Copyright 2004-2023 Free Software Foundation, Inc.
6 Contributed by the AriC and Caramba projects, INRIA.
7
8 This file is part of the GNU MPFR Library.
9
10 The GNU MPFR Library is free software; you can redistribute it and/or modify
11 it under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or (at your
13 option) any later version.
14
15 The GNU MPFR Library is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18 License for more details.
19
20 You should have received a copy of the GNU Lesser General Public License
21 along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
22 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
23 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
24
25 #define MPFR_NEED_INTMAX_H
26 #include "mpfr-test.h"
27
28 #define FTEST_AUX(N,NOT,FCT) \
29 do \
30 { \
31 __gmpfr_flags = ex_flags; \
32 if (NOT FCT (x, (mpfr_rnd_t) r)) \
33 { \
34 printf ("Error %d for %s, rnd = %s and x = ", \
35 N, #FCT, \
36 mpfr_print_rnd_mode ((mpfr_rnd_t) r)); \
37 mpfr_dump (x); \
38 exit (1); \
39 } \
40 if (__gmpfr_flags != ex_flags) \
41 { \
42 mpfr_flags_t flags = __gmpfr_flags; \
43 printf ("Flags error %d for %s, rnd = %s and x = ", \
44 N, #FCT, \
45 mpfr_print_rnd_mode ((mpfr_rnd_t) r)); \
46 mpfr_dump(x); \
47 printf ("Expected flags:"); \
48 flags_out (ex_flags); \
49 printf ("Got flags: "); \
50 flags_out (flags); \
51 exit (1); \
52 } \
53 } \
54 while (0)
55
56 #define FTEST(N,NOT,FCT) \
57 do \
58 { \
59 mpfr_exp_t e; \
60 FTEST_AUX (N,NOT,FCT); \
61 if (MPFR_IS_SINGULAR (x)) \
62 break; \
63 e = mpfr_get_exp (x); \
64 set_emin (e); \
65 set_emax (e); \
66 FTEST_AUX (N,NOT,FCT); \
67 set_emin (emin); \
68 set_emax (emax); \
69 } \
70 while (0)
71
72 #define CHECK_ALL(N,NOT) \
73 do \
74 { \
75 FTEST (N, NOT, mpfr_fits_ulong_p); \
76 FTEST (N, NOT, mpfr_fits_slong_p); \
77 FTEST (N, NOT, mpfr_fits_uint_p); \
78 FTEST (N, NOT, mpfr_fits_sint_p); \
79 FTEST (N, NOT, mpfr_fits_ushort_p); \
80 FTEST (N, NOT, mpfr_fits_sshort_p); \
81 } \
82 while (0)
83
84 #define CHECK_MAX(N,NOT) \
85 do \
86 { \
87 FTEST (N, NOT, mpfr_fits_uintmax_p); \
88 FTEST (N, NOT, mpfr_fits_intmax_p); \
89 } \
90 while (0)
91
92 /* V is a non-zero limit for the type (*_MIN for a signed type or *_MAX).
93 * If V is positive, then test V, V + 1/4, V + 3/4 and V + 1.
94 * If V is negative, then test V, V - 1/4, V - 3/4 and V - 1.
95 */
96 #define CHECK_LIM(N,V,SET,FCT) \
97 do \
98 { \
99 SET (x, V, MPFR_RNDN); \
100 FTEST (N, !, FCT); \
101 mpfr_set_si_2exp (y, (V) < 0 ? -1 : 1, -2, MPFR_RNDN); \
102 mpfr_add (x, x, y, MPFR_RNDN); \
103 FTEST (N+1, (r == MPFR_RNDN || \
104 MPFR_IS_LIKE_RNDZ (r, (V) < 0)) ^ !!, FCT); \
105 mpfr_add (x, x, y, MPFR_RNDN); \
106 mpfr_add (x, x, y, MPFR_RNDN); \
107 FTEST (N+3, MPFR_IS_LIKE_RNDZ (r, (V) < 0) ^ !!, FCT); \
108 mpfr_add (x, x, y, MPFR_RNDN); \
109 FTEST (N+4, !!, FCT); \
110 } \
111 while (0)
112
113 int
main(void)114 main (void)
115 {
116 mpfr_exp_t emin, emax;
117 mpfr_t x, y;
118 mpfr_flags_t flags[2] = { 0, MPFR_FLAGS_ALL }, ex_flags;
119 int i, r, fi;
120
121 tests_start_mpfr ();
122
123 emin = mpfr_get_emin ();
124 emax = mpfr_get_emax ();
125
126 mpfr_init2 (x, sizeof (unsigned long) * CHAR_BIT + 2);
127 mpfr_init2 (y, 8);
128
129 RND_LOOP (r)
130 for (fi = 0; fi < numberof (flags); fi++)
131 {
132 ex_flags = flags[fi];
133
134 /* Check NaN */
135 mpfr_set_nan (x);
136 CHECK_ALL (1, !!);
137
138 /* Check +Inf */
139 mpfr_set_inf (x, 1);
140 CHECK_ALL (2, !!);
141
142 /* Check -Inf */
143 mpfr_set_inf (x, -1);
144 CHECK_ALL (3, !!);
145
146 /* Check +0 */
147 mpfr_set_zero (x, 1);
148 CHECK_ALL (4, !);
149
150 /* Check -0 */
151 mpfr_set_zero (x, -1);
152 CHECK_ALL (5, !);
153
154 /* Check small positive op */
155 mpfr_set_str1 (x, "1@-1");
156 CHECK_ALL (6, !);
157
158 /* Check 17 */
159 mpfr_set_ui (x, 17, MPFR_RNDN);
160 CHECK_ALL (7, !);
161
162 /* Check large values (no fit) */
163 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
164 mpfr_mul_2ui (x, x, 1, MPFR_RNDN);
165 CHECK_ALL (8, !!);
166 mpfr_mul_2ui (x, x, 40, MPFR_RNDN);
167 CHECK_ALL (9, !!);
168
169 /* Check a non-integer number just below a power of two. */
170 mpfr_set_ui_2exp (x, 255, -2, MPFR_RNDN);
171 CHECK_ALL (10, !);
172
173 /* Check the limits of the types (except 0 for unsigned types) */
174 CHECK_LIM (20, ULONG_MAX, mpfr_set_ui, mpfr_fits_ulong_p);
175 CHECK_LIM (30, LONG_MAX, mpfr_set_si, mpfr_fits_slong_p);
176 CHECK_LIM (35, LONG_MIN, mpfr_set_si, mpfr_fits_slong_p);
177 CHECK_LIM (40, UINT_MAX, mpfr_set_ui, mpfr_fits_uint_p);
178 CHECK_LIM (50, INT_MAX, mpfr_set_si, mpfr_fits_sint_p);
179 CHECK_LIM (55, INT_MIN, mpfr_set_si, mpfr_fits_sint_p);
180 CHECK_LIM (60, USHRT_MAX, mpfr_set_ui, mpfr_fits_ushort_p);
181 CHECK_LIM (70, SHRT_MAX, mpfr_set_si, mpfr_fits_sshort_p);
182 CHECK_LIM (75, SHRT_MIN, mpfr_set_si, mpfr_fits_sshort_p);
183
184 /* Check negative op */
185 for (i = 1; i <= 4; i++)
186 {
187 int inv;
188
189 mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN);
190 /* for RNDF, it fits if it fits when rounding away from zero */
191 mpfr_rint (y, x, r != MPFR_RNDF ? (mpfr_rnd_t) r : MPFR_RNDA);
192 inv = MPFR_NOTZERO (y);
193 FTEST (80, inv ^ !, mpfr_fits_ulong_p);
194 FTEST (81, !, mpfr_fits_slong_p);
195 FTEST (82, inv ^ !, mpfr_fits_uint_p);
196 FTEST (83, !, mpfr_fits_sint_p);
197 FTEST (84, inv ^ !, mpfr_fits_ushort_p);
198 FTEST (85, !, mpfr_fits_sshort_p);
199 }
200 }
201
202 #ifdef _MPFR_H_HAVE_INTMAX_T
203
204 mpfr_set_prec (x, sizeof (uintmax_t) * CHAR_BIT + 2);
205
206 RND_LOOP (r)
207 {
208 /* Check NaN */
209 mpfr_set_nan (x);
210 CHECK_MAX (1, !!);
211
212 /* Check +Inf */
213 mpfr_set_inf (x, 1);
214 CHECK_MAX (2, !!);
215
216 /* Check -Inf */
217 mpfr_set_inf (x, -1);
218 CHECK_MAX (3, !!);
219
220 /* Check +0 */
221 mpfr_set_zero (x, 1);
222 CHECK_MAX (4, !);
223
224 /* Check -0 */
225 mpfr_set_zero (x, -1);
226 CHECK_MAX (5, !);
227
228 /* Check small positive op */
229 mpfr_set_str1 (x, "1@-1");
230 CHECK_MAX (6, !);
231
232 /* Check 17 */
233 mpfr_set_ui (x, 17, MPFR_RNDN);
234 CHECK_MAX (7, !);
235
236 /* Check hugest */
237 mpfr_set_ui_2exp (x, 42, sizeof (uintmax_t) * 32, MPFR_RNDN);
238 CHECK_MAX (8, !!);
239
240 /* Check a non-integer number just below a power of two. */
241 mpfr_set_ui_2exp (x, 255, -2, MPFR_RNDN);
242 CHECK_MAX (10, !);
243
244 /* Check the limits of the types (except 0 for uintmax_t) */
245 CHECK_LIM (20, UINTMAX_MAX, mpfr_set_uj, mpfr_fits_uintmax_p);
246 CHECK_LIM (30, INTMAX_MAX, mpfr_set_sj, mpfr_fits_intmax_p);
247 CHECK_LIM (35, INTMAX_MIN, mpfr_set_sj, mpfr_fits_intmax_p);
248
249 /* Check negative op */
250 for (i = 1; i <= 4; i++)
251 {
252 int inv;
253
254 mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN);
255 mpfr_rint (y, x, (mpfr_rnd_t) r);
256 inv = MPFR_NOTZERO (y);
257 if (r != MPFR_RNDF)
258 FTEST (80, inv ^ !, mpfr_fits_uintmax_p);
259 else
260 FTEST (80, !!, mpfr_fits_uintmax_p);
261 FTEST (81, !, mpfr_fits_intmax_p);
262 }
263 }
264
265 #endif /* _MPFR_H_HAVE_INTMAX_T */
266
267 mpfr_clear (x);
268 mpfr_clear (y);
269
270 tests_end_mpfr ();
271 return 0;
272 }
273