xref: /netbsd-src/external/lgpl3/gmp/dist/tests/mpz/t-fits.c (revision 32d1c65c71fbdb65a012e8392a62a757dd6853e9)
1 /* Test mpz_fits_*_p */
2 
3 /*
4 Copyright 2001 Free Software Foundation, Inc.
5 
6 This file is part of the GNU MP Library test suite.
7 
8 The GNU MP Library test suite is free software; you can redistribute it
9 and/or modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 3 of the License,
11 or (at your option) any later version.
12 
13 The GNU MP Library test suite is distributed in the hope that it will be
14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
16 Public License for more details.
17 
18 You should have received a copy of the GNU General Public License along with
19 the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include "gmp-impl.h"
24 #include "tests.h"
25 
26 
27 /* Nothing sophisticated here, just exercise mpz_fits_*_p on a small amount
28    of data. */
29 
30 #define EXPECT_S(fun,name,answer)                                       \
31   got = fun (z);                                                        \
32   if (got != answer)                                                    \
33     {                                                                   \
34       printf ("%s (%s) got %d want %d\n", name, expr, got, answer);     \
35       printf (" z size %d\n", SIZ(z));                                  \
36       printf (" z dec "); mpz_out_str (stdout, 10, z); printf ("\n");   \
37       printf (" z hex "); mpz_out_str (stdout, 16, z); 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   mpz_t       z;
47   int         got;
48   const char  *expr;
49   int         error = 0;
50 
51   tests_start ();
52   mpz_init (z);
53 
54   mpz_set_ui (z, 0L);
55   expr = "0";
56   EXPECT (mpz_fits_ulong_p, 1);
57   EXPECT (mpz_fits_uint_p, 1);
58   EXPECT (mpz_fits_ushort_p, 1);
59   EXPECT (mpz_fits_slong_p, 1);
60   EXPECT (mpz_fits_sint_p, 1);
61   EXPECT (mpz_fits_sshort_p, 1);
62 
63   mpz_set_ui (z, 1L);
64   expr = "1";
65   EXPECT (mpz_fits_ulong_p, 1);
66   EXPECT (mpz_fits_uint_p, 1);
67   EXPECT (mpz_fits_ushort_p, 1);
68   EXPECT (mpz_fits_slong_p, 1);
69   EXPECT (mpz_fits_sint_p, 1);
70   EXPECT (mpz_fits_sshort_p, 1);
71 
72   mpz_set_si (z, -1L);
73   expr = "-1";
74   EXPECT (mpz_fits_ulong_p, 0);
75   EXPECT (mpz_fits_uint_p, 0);
76   EXPECT (mpz_fits_ushort_p, 0);
77   EXPECT (mpz_fits_slong_p, 1);
78   EXPECT (mpz_fits_sint_p, 1);
79   EXPECT (mpz_fits_sshort_p, 1);
80 
81   mpz_set_ui (z, 1L);
82   mpz_mul_2exp (z, z, 5L*GMP_LIMB_BITS);
83   expr = "2^(5*BPML)";
84   EXPECT (mpz_fits_ulong_p, 0);
85   EXPECT (mpz_fits_uint_p, 0);
86   EXPECT (mpz_fits_ushort_p, 0);
87   EXPECT (mpz_fits_slong_p, 0);
88   EXPECT (mpz_fits_sint_p, 0);
89   EXPECT (mpz_fits_sshort_p, 0);
90 
91 
92   mpz_set_ui (z, (unsigned long) USHRT_MAX);
93   expr = "USHRT_MAX";
94   EXPECT (mpz_fits_ulong_p, 1);
95   EXPECT (mpz_fits_uint_p, 1);
96   EXPECT (mpz_fits_ushort_p, 1);
97 
98   mpz_set_ui (z, (unsigned long) USHRT_MAX);
99   mpz_add_ui (z, z, 1L);
100   expr = "USHRT_MAX + 1";
101   EXPECT (mpz_fits_ushort_p, 0);
102 
103 
104   mpz_set_ui (z, (unsigned long) UINT_MAX);
105   expr = "UINT_MAX";
106   EXPECT (mpz_fits_ulong_p, 1);
107   EXPECT (mpz_fits_uint_p, 1);
108 
109   mpz_set_ui (z, (unsigned long) UINT_MAX);
110   mpz_add_ui (z, z, 1L);
111   expr = "UINT_MAX + 1";
112   EXPECT (mpz_fits_uint_p, 0);
113 
114 
115   mpz_set_ui (z, ULONG_MAX);
116   expr = "ULONG_MAX";
117   EXPECT (mpz_fits_ulong_p, 1);
118 
119   mpz_set_ui (z, ULONG_MAX);
120   mpz_add_ui (z, z, 1L);
121   expr = "ULONG_MAX + 1";
122   EXPECT (mpz_fits_ulong_p, 0);
123 
124 
125   mpz_set_si (z, (long) SHRT_MAX);
126   expr = "SHRT_MAX";
127   EXPECT (mpz_fits_slong_p, 1);
128   EXPECT (mpz_fits_sint_p, 1);
129   EXPECT (mpz_fits_sshort_p, 1);
130 
131   mpz_set_si (z, (long) SHRT_MAX);
132   mpz_add_ui (z, z, 1L);
133   expr = "SHRT_MAX + 1";
134   EXPECT (mpz_fits_sshort_p, 0);
135 
136 
137   mpz_set_si (z, (long) INT_MAX);
138   expr = "INT_MAX";
139   EXPECT (mpz_fits_slong_p, 1);
140   EXPECT (mpz_fits_sint_p, 1);
141 
142   mpz_set_si (z, (long) INT_MAX);
143   mpz_add_ui (z, z, 1L);
144   expr = "INT_MAX + 1";
145   EXPECT (mpz_fits_sint_p, 0);
146 
147 
148   mpz_set_si (z, LONG_MAX);
149   expr = "LONG_MAX";
150   EXPECT (mpz_fits_slong_p, 1);
151 
152   mpz_set_si (z, LONG_MAX);
153   mpz_add_ui (z, z, 1L);
154   expr = "LONG_MAX + 1";
155   EXPECT (mpz_fits_slong_p, 0);
156 
157 
158   mpz_set_si (z, (long) SHRT_MIN);
159   expr = "SHRT_MIN";
160   EXPECT (mpz_fits_slong_p, 1);
161   EXPECT (mpz_fits_sint_p, 1);
162   EXPECT (mpz_fits_sshort_p, 1);
163 
164   mpz_set_si (z, (long) SHRT_MIN);
165   mpz_sub_ui (z, z, 1L);
166   expr = "SHRT_MIN + 1";
167   EXPECT (mpz_fits_sshort_p, 0);
168 
169 
170   mpz_set_si (z, (long) INT_MIN);
171   expr = "INT_MIN";
172   EXPECT (mpz_fits_slong_p, 1);
173   EXPECT (mpz_fits_sint_p, 1);
174 
175   mpz_set_si (z, (long) INT_MIN);
176   mpz_sub_ui (z, z, 1L);
177   expr = "INT_MIN + 1";
178   EXPECT (mpz_fits_sint_p, 0);
179 
180 
181   mpz_set_si (z, LONG_MIN);
182   expr = "LONG_MIN";
183   EXPECT (mpz_fits_slong_p, 1);
184 
185   mpz_set_si (z, LONG_MIN);
186   mpz_sub_ui (z, z, 1L);
187   expr = "LONG_MIN + 1";
188   EXPECT (mpz_fits_slong_p, 0);
189 
190 
191   if (error)
192     abort ();
193 
194   mpz_clear (z);
195   tests_end ();
196   exit (0);
197 }
198