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