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