blob: 937e4e6e153c1f5d53098114f63ad0dfab5512b1 [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001/* Test mpf_fits_*_p
2
3Copyright 2001, 2002, 2013 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library test suite.
6
7The GNU MP Library test suite is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 3 of the License,
10or (at your option) any later version.
11
12The GNU MP Library test suite is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15Public License for more details.
16
17You should have received a copy of the GNU General Public License along with
18the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
19
20#include <stdio.h>
21#include <stdlib.h>
22#include "gmp-impl.h"
23#include "tests.h"
24
25
26/* Nothing sophisticated here, just exercise mpf_fits_*_p on a small amount
27 of data. */
28
29#define EXPECT_S(fun,name,answer) \
30 got = fun (f); \
31 if (got != answer) \
32 { \
33 printf ("%s (%s) got %d want %d\n", name, expr, got, answer); \
34 printf (" f size %d exp %ld\n", SIZ(f), EXP(f)); \
35 printf (" f dec "); mpf_out_str (stdout, 10, 0, f); printf ("\n"); \
36 printf (" f hex "); mpf_out_str (stdout, 16, 0, f); printf ("\n"); \
37 error = 1; \
38 }
39
40#define EXPECT(fun,answer) EXPECT_S(fun,#fun,answer)
41
42int
43main (void)
44{
45 mpf_t f, f0p5;
46 int got;
47 const char *expr;
48 int error = 0;
49
50 tests_start ();
51 mpf_init2 (f, 200L);
52 mpf_init2 (f0p5, 200L);
53
54 /* 0.5 */
55 mpf_set_ui (f0p5, 1L);
56 mpf_div_2exp (f0p5, f0p5, 1L);
57
58 mpf_set_ui (f, 0L);
59 expr = "0";
60 EXPECT (mpf_fits_ulong_p, 1);
61 EXPECT (mpf_fits_uint_p, 1);
62 EXPECT (mpf_fits_ushort_p, 1);
63 EXPECT (mpf_fits_slong_p, 1);
64 EXPECT (mpf_fits_sint_p, 1);
65 EXPECT (mpf_fits_sshort_p, 1);
66
67 mpf_set_ui (f, 1L);
68 expr = "1";
69 EXPECT (mpf_fits_ulong_p, 1);
70 EXPECT (mpf_fits_uint_p, 1);
71 EXPECT (mpf_fits_ushort_p, 1);
72 EXPECT (mpf_fits_slong_p, 1);
73 EXPECT (mpf_fits_sint_p, 1);
74 EXPECT (mpf_fits_sshort_p, 1);
75
76 mpf_set_si (f, -1L);
77 expr = "-1";
78 EXPECT (mpf_fits_ulong_p, 0);
79 EXPECT (mpf_fits_uint_p, 0);
80 EXPECT (mpf_fits_ushort_p, 0);
81 EXPECT (mpf_fits_slong_p, 1);
82 EXPECT (mpf_fits_sint_p, 1);
83 EXPECT (mpf_fits_sshort_p, 1);
84
85
86 mpf_set_ui (f, (unsigned long) USHRT_MAX);
87 expr = "USHRT_MAX";
88 EXPECT (mpf_fits_ulong_p, 1);
89 EXPECT (mpf_fits_uint_p, 1);
90 EXPECT (mpf_fits_ushort_p, 1);
91
92 mpf_set_ui (f, (unsigned long) USHRT_MAX);
93 mpf_add (f, f, f0p5);
94 expr = "USHRT_MAX + 0.5";
95 EXPECT (mpf_fits_ulong_p, 1);
96 EXPECT (mpf_fits_uint_p, 1);
97 EXPECT (mpf_fits_ushort_p, 1);
98
99 mpf_set_ui (f, (unsigned long) USHRT_MAX);
100 mpf_add_ui (f, f, 1L);
101 expr = "USHRT_MAX + 1";
102 EXPECT (mpf_fits_ushort_p, 0);
103
104
105 mpf_set_ui (f, (unsigned long) UINT_MAX);
106 expr = "UINT_MAX";
107 EXPECT (mpf_fits_ulong_p, 1);
108 EXPECT (mpf_fits_uint_p, 1);
109
110 mpf_set_ui (f, (unsigned long) UINT_MAX);
111 mpf_add (f, f, f0p5);
112 expr = "UINT_MAX + 0.5";
113 EXPECT (mpf_fits_ulong_p, 1);
114 EXPECT (mpf_fits_uint_p, 1);
115
116 mpf_set_ui (f, (unsigned long) UINT_MAX);
117 mpf_add_ui (f, f, 1L);
118 expr = "UINT_MAX + 1";
119 EXPECT (mpf_fits_uint_p, 0);
120
121
122 mpf_set_ui (f, ULONG_MAX);
123 expr = "ULONG_MAX";
124 EXPECT (mpf_fits_ulong_p, 1);
125
126 mpf_set_ui (f, ULONG_MAX);
127 mpf_add (f, f, f0p5);
128 expr = "ULONG_MAX + 0.5";
129 EXPECT (mpf_fits_ulong_p, 1);
130
131 mpf_set_ui (f, ULONG_MAX);
132 mpf_add_ui (f, f, 1L);
133 expr = "ULONG_MAX + 1";
134 EXPECT (mpf_fits_ulong_p, 0);
135
136
137 mpf_set_si (f, (long) SHRT_MAX);
138 expr = "SHRT_MAX";
139 EXPECT (mpf_fits_slong_p, 1);
140 EXPECT (mpf_fits_sint_p, 1);
141 EXPECT (mpf_fits_sshort_p, 1);
142
143 mpf_set_si (f, (long) SHRT_MAX);
144 expr = "SHRT_MAX + 0.5";
145 mpf_add (f, f, f0p5);
146 EXPECT (mpf_fits_slong_p, 1);
147 EXPECT (mpf_fits_sint_p, 1);
148 EXPECT (mpf_fits_sshort_p, 1);
149
150 mpf_set_si (f, (long) SHRT_MAX);
151 mpf_add_ui (f, f, 1L);
152 expr = "SHRT_MAX + 1";
153 EXPECT (mpf_fits_sshort_p, 0);
154
155
156 mpf_set_si (f, (long) INT_MAX);
157 expr = "INT_MAX";
158 EXPECT (mpf_fits_slong_p, 1);
159 EXPECT (mpf_fits_sint_p, 1);
160
161 mpf_set_si (f, (long) INT_MAX);
162 mpf_add (f, f, f0p5);
163 expr = "INT_MAX + 0.5";
164 EXPECT (mpf_fits_slong_p, 1);
165 EXPECT (mpf_fits_sint_p, 1);
166
167 mpf_set_si (f, (long) INT_MAX);
168 mpf_add_ui (f, f, 1L);
169 expr = "INT_MAX + 1";
170 EXPECT (mpf_fits_sint_p, 0);
171
172
173 mpf_set_si (f, LONG_MAX);
174 expr = "LONG_MAX";
175 EXPECT (mpf_fits_slong_p, 1);
176
177 mpf_set_si (f, LONG_MAX);
178 mpf_add (f, f, f0p5);
179 expr = "LONG_MAX + 0.5";
180 EXPECT (mpf_fits_slong_p, 1);
181
182 mpf_set_si (f, LONG_MAX);
183 mpf_add_ui (f, f, 1L);
184 expr = "LONG_MAX + 1";
185 EXPECT (mpf_fits_slong_p, 0);
186
187
188 mpf_set_si (f, (long) SHRT_MIN);
189 expr = "SHRT_MIN";
190 EXPECT (mpf_fits_slong_p, 1);
191 EXPECT (mpf_fits_sint_p, 1);
192 EXPECT (mpf_fits_sshort_p, 1);
193
194 mpf_set_si (f, (long) SHRT_MIN);
195 mpf_sub (f, f, f0p5);
196 expr = "SHRT_MIN - 0.5";
197 EXPECT (mpf_fits_slong_p, 1);
198 EXPECT (mpf_fits_sint_p, 1);
199 EXPECT (mpf_fits_sshort_p, 1);
200
201 mpf_set_si (f, (long) SHRT_MIN);
202 mpf_sub_ui (f, f, 1L);
203 expr = "SHRT_MIN - 1";
204 EXPECT (mpf_fits_sshort_p, 0);
205
206
207 mpf_set_si (f, (long) INT_MIN);
208 expr = "INT_MIN";
209 EXPECT (mpf_fits_slong_p, 1);
210 EXPECT (mpf_fits_sint_p, 1);
211
212 mpf_set_si (f, (long) INT_MIN);
213 mpf_sub (f, f, f0p5);
214 expr = "INT_MIN - 0.5";
215 EXPECT (mpf_fits_slong_p, 1);
216 EXPECT (mpf_fits_sint_p, 1);
217
218 mpf_set_si (f, (long) INT_MIN);
219 mpf_sub_ui (f, f, 1L);
220 expr = "INT_MIN - 1";
221 EXPECT (mpf_fits_sint_p, 0);
222
223
224 mpf_set_si (f, LONG_MIN);
225 expr = "LONG_MIN";
226 EXPECT (mpf_fits_slong_p, 1);
227
228 mpf_set_si (f, LONG_MIN);
229 mpf_sub (f, f, f0p5);
230 expr = "LONG_MIN - 0.5";
231 EXPECT (mpf_fits_slong_p, 1);
232
233 mpf_set_si (f, LONG_MIN);
234 mpf_sub_ui (f, f, 1L);
235 expr = "LONG_MIN - 1";
236 EXPECT (mpf_fits_slong_p, 0);
237
238
239 mpf_set_str_or_abort (f, "0.5", 10);
240 expr = "0.5";
241 EXPECT (mpf_fits_ulong_p, 1);
242 EXPECT (mpf_fits_uint_p, 1);
243 EXPECT (mpf_fits_ushort_p, 1);
244 EXPECT (mpf_fits_slong_p, 1);
245 EXPECT (mpf_fits_sint_p, 1);
246 EXPECT (mpf_fits_sshort_p, 1);
247
248 mpf_set_str_or_abort (f, "-0.5", 10);
249 expr = "-0.5";
250 EXPECT (mpf_fits_ulong_p, 1);
251 EXPECT (mpf_fits_uint_p, 1);
252 EXPECT (mpf_fits_ushort_p, 1);
253 EXPECT (mpf_fits_slong_p, 1);
254 EXPECT (mpf_fits_sint_p, 1);
255 EXPECT (mpf_fits_sshort_p, 1);
256
257 mpf_set_str_or_abort (f, "-1.5", 10);
258 expr = "-1.5";
259 EXPECT (mpf_fits_ulong_p, 0);
260 EXPECT (mpf_fits_uint_p, 0);
261 EXPECT (mpf_fits_ushort_p, 0);
262 EXPECT (mpf_fits_slong_p, 1);
263 EXPECT (mpf_fits_sint_p, 1);
264 EXPECT (mpf_fits_sshort_p, 1);
265
266
267 mpf_set_str_or_abort (f, "1.000000000000000000000000000000000001", 16);
268 expr = "1.000000000000000000000000000000000001 base 16";
269 EXPECT (mpf_fits_ulong_p, 1);
270 EXPECT (mpf_fits_uint_p, 1);
271 EXPECT (mpf_fits_ushort_p, 1);
272 EXPECT (mpf_fits_slong_p, 1);
273 EXPECT (mpf_fits_sint_p, 1);
274 EXPECT (mpf_fits_sshort_p, 1);
275
276 mpf_set_str_or_abort (f, "1@1000", 16);
277 expr = "1@1000 base 16";
278 EXPECT (mpf_fits_ulong_p, 0);
279 EXPECT (mpf_fits_uint_p, 0);
280 EXPECT (mpf_fits_ushort_p, 0);
281 EXPECT (mpf_fits_slong_p, 0);
282 EXPECT (mpf_fits_sint_p, 0);
283 EXPECT (mpf_fits_sshort_p, 0);
284
285
286 mpf_set_ui (f, 1L);
287 mpf_mul_2exp (f, f, BITS_PER_ULONG + 1);
288 mpf_sub_ui (f, f, 1L);
289 expr = "2^(BITS_PER_ULONG+1) - 1";
290 EXPECT (mpf_fits_ulong_p, 0);
291 EXPECT (mpf_fits_uint_p, 0);
292 EXPECT (mpf_fits_ushort_p, 0);
293 EXPECT (mpf_fits_slong_p, 0);
294 EXPECT (mpf_fits_sint_p, 0);
295 EXPECT (mpf_fits_sshort_p, 0);
296
297 mpf_set_ui (f, 1L);
298 mpf_mul_2exp (f, f, BITS_PER_ULONG + 1);
299 mpf_ui_sub (f, 1L, f);
300 expr = "- (2^(BITS_PER_ULONG+1) - 1)";
301 EXPECT (mpf_fits_ulong_p, 0);
302 EXPECT (mpf_fits_uint_p, 0);
303 EXPECT (mpf_fits_ushort_p, 0);
304 EXPECT (mpf_fits_slong_p, 0);
305 EXPECT (mpf_fits_sint_p, 0);
306 EXPECT (mpf_fits_sshort_p, 0);
307
308 mpf_set_ui (f, 1L);
309 mpf_mul_2exp (f, f, BITS_PER_ULONG + 5);
310 mpf_sub_ui (f, f, 1L);
311 expr = "2^(BITS_PER_ULONG+5) - 1";
312 EXPECT (mpf_fits_ulong_p, 0);
313 EXPECT (mpf_fits_uint_p, 0);
314 EXPECT (mpf_fits_ushort_p, 0);
315 EXPECT (mpf_fits_slong_p, 0);
316 EXPECT (mpf_fits_sint_p, 0);
317 EXPECT (mpf_fits_sshort_p, 0);
318
319
320 if (error)
321 abort ();
322
323 mpf_clear (f);
324 mpf_clear (f0p5);
325 tests_end ();
326 exit (0);
327}