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