OLD | NEW |
| (Empty) |
1 /* Test file for: | |
2 mpfr_fits_sint_p, mpfr_fits_slong_p, mpfr_fits_sshort_p, | |
3 mpfr_fits_uint_p, mpfr_fits_ulong_p, mpfr_fits_ushort_p | |
4 | |
5 Copyright 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. | |
6 Contributed by the Arenaire and Cacao projects, INRIA. | |
7 | |
8 This file is part of the GNU MPFR Library. | |
9 | |
10 The GNU MPFR Library is free software; you can redistribute it and/or modify | |
11 it under the terms of the GNU Lesser General Public License as published by | |
12 the Free Software Foundation; either version 2.1 of the License, or (at your | |
13 option) any later version. | |
14 | |
15 The GNU MPFR Library is distributed in the hope that it will be useful, but | |
16 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | |
18 License for more details. | |
19 | |
20 You should have received a copy of the GNU Lesser General Public License | |
21 along with the GNU MPFR Library; see the file COPYING.LIB. If not, write to | |
22 the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | |
23 MA 02110-1301, USA. */ | |
24 | |
25 #ifdef HAVE_CONFIG_H | |
26 # include "config.h" /* for a build within gmp */ | |
27 #endif | |
28 | |
29 #include <stdio.h> | |
30 #include <stdlib.h> | |
31 #include <limits.h> | |
32 | |
33 /* The ISO C99 standard specifies that in C++ implementations the | |
34 INTMAX_MAX, ... macros should only be defined if explicitly requested. */ | |
35 #if defined __cplusplus | |
36 # define __STDC_LIMIT_MACROS | |
37 # define __STDC_CONSTANT_MACROS | |
38 #endif | |
39 | |
40 #if HAVE_INTTYPES_H | |
41 # include <inttypes.h> /* for intmax_t */ | |
42 #else | |
43 # if HAVE_STDINT_H | |
44 # include <stdint.h> | |
45 # endif | |
46 #endif | |
47 | |
48 #include "mpfr-test.h" | |
49 | |
50 #define ERROR1 { printf("Initial error for x="); mpfr_dump(x); exit(1); } | |
51 #define ERROR2 { printf("Error for x="); mpfr_dump(x); exit(1); } | |
52 | |
53 static void check_intmax (void); | |
54 | |
55 int | |
56 main (void) | |
57 { | |
58 mpfr_t x; | |
59 | |
60 tests_start_mpfr (); | |
61 | |
62 mpfr_init2 (x, 256); | |
63 | |
64 /* Check NAN */ | |
65 mpfr_set_nan(x); | |
66 if (mpfr_fits_ulong_p(x, GMP_RNDN)) | |
67 ERROR1; | |
68 if (mpfr_fits_slong_p(x, GMP_RNDN)) | |
69 ERROR1; | |
70 if (mpfr_fits_uint_p(x, GMP_RNDN)) | |
71 ERROR1; | |
72 if (mpfr_fits_sint_p(x, GMP_RNDN)) | |
73 ERROR1; | |
74 if (mpfr_fits_ushort_p(x, GMP_RNDN)) | |
75 ERROR1; | |
76 if (mpfr_fits_sshort_p(x, GMP_RNDN)) | |
77 ERROR1; | |
78 | |
79 /* Check INF */ | |
80 mpfr_set_inf(x, 1); | |
81 if (mpfr_fits_ulong_p(x, GMP_RNDN)) | |
82 ERROR1; | |
83 if (mpfr_fits_slong_p(x, GMP_RNDN)) | |
84 ERROR1; | |
85 if (mpfr_fits_uint_p(x, GMP_RNDN)) | |
86 ERROR1; | |
87 if (mpfr_fits_sint_p(x, GMP_RNDN)) | |
88 ERROR1; | |
89 if (mpfr_fits_ushort_p(x, GMP_RNDN)) | |
90 ERROR1; | |
91 if (mpfr_fits_sshort_p(x, GMP_RNDN)) | |
92 ERROR1; | |
93 | |
94 /* Check Zero */ | |
95 MPFR_SET_ZERO(x); | |
96 if (!mpfr_fits_ulong_p(x, GMP_RNDN)) | |
97 ERROR2; | |
98 if (!mpfr_fits_slong_p(x, GMP_RNDN)) | |
99 ERROR2; | |
100 if (!mpfr_fits_uint_p(x, GMP_RNDN)) | |
101 ERROR2; | |
102 if (!mpfr_fits_sint_p(x, GMP_RNDN)) | |
103 ERROR2; | |
104 if (!mpfr_fits_ushort_p(x, GMP_RNDN)) | |
105 ERROR2; | |
106 if (!mpfr_fits_sshort_p(x, GMP_RNDN)) | |
107 ERROR2; | |
108 | |
109 /* Check small op */ | |
110 mpfr_set_str1 (x, "1@-1"); | |
111 if (!mpfr_fits_ulong_p(x, GMP_RNDN)) | |
112 ERROR2; | |
113 if (!mpfr_fits_slong_p(x, GMP_RNDN)) | |
114 ERROR2; | |
115 if (!mpfr_fits_uint_p(x, GMP_RNDN)) | |
116 ERROR2; | |
117 if (!mpfr_fits_sint_p(x, GMP_RNDN)) | |
118 ERROR2; | |
119 if (!mpfr_fits_ushort_p(x, GMP_RNDN)) | |
120 ERROR2; | |
121 if (!mpfr_fits_sshort_p(x, GMP_RNDN)) | |
122 ERROR2; | |
123 | |
124 /* Check 17 */ | |
125 mpfr_set_ui (x, 17, GMP_RNDN); | |
126 if (!mpfr_fits_ulong_p(x, GMP_RNDN)) | |
127 ERROR2; | |
128 if (!mpfr_fits_slong_p(x, GMP_RNDN)) | |
129 ERROR2; | |
130 if (!mpfr_fits_uint_p(x, GMP_RNDN)) | |
131 ERROR2; | |
132 if (!mpfr_fits_sint_p(x, GMP_RNDN)) | |
133 ERROR2; | |
134 if (!mpfr_fits_ushort_p(x, GMP_RNDN)) | |
135 ERROR2; | |
136 if (!mpfr_fits_sshort_p(x, GMP_RNDN)) | |
137 ERROR2; | |
138 | |
139 /* Check all other values */ | |
140 mpfr_set_ui(x, ULONG_MAX, GMP_RNDN); | |
141 mpfr_mul_2exp(x, x, 1, GMP_RNDN); | |
142 if (mpfr_fits_ulong_p(x, GMP_RNDN)) | |
143 ERROR1; | |
144 if (mpfr_fits_slong_p(x, GMP_RNDN)) | |
145 ERROR1; | |
146 mpfr_mul_2exp(x, x, 40, GMP_RNDN); | |
147 if (mpfr_fits_ulong_p(x, GMP_RNDN)) | |
148 ERROR1; | |
149 if (mpfr_fits_uint_p(x, GMP_RNDN)) | |
150 ERROR1; | |
151 if (mpfr_fits_sint_p(x, GMP_RNDN)) | |
152 ERROR1; | |
153 if (mpfr_fits_ushort_p(x, GMP_RNDN)) | |
154 ERROR1; | |
155 if (mpfr_fits_sshort_p(x, GMP_RNDN)) | |
156 ERROR1; | |
157 | |
158 mpfr_set_ui(x, ULONG_MAX, GMP_RNDN); | |
159 if (!mpfr_fits_ulong_p(x, GMP_RNDN)) | |
160 ERROR2; | |
161 mpfr_set_ui(x, LONG_MAX, GMP_RNDN); | |
162 if (!mpfr_fits_slong_p(x, GMP_RNDN)) | |
163 ERROR2; | |
164 mpfr_set_ui(x, UINT_MAX, GMP_RNDN); | |
165 if (!mpfr_fits_uint_p(x, GMP_RNDN)) | |
166 ERROR2; | |
167 mpfr_set_ui(x, INT_MAX, GMP_RNDN); | |
168 if (!mpfr_fits_sint_p(x, GMP_RNDN)) | |
169 ERROR2; | |
170 mpfr_set_ui(x, USHRT_MAX, GMP_RNDN); | |
171 if (!mpfr_fits_ushort_p(x, GMP_RNDN)) | |
172 ERROR2; | |
173 mpfr_set_ui(x, SHRT_MAX, GMP_RNDN); | |
174 if (!mpfr_fits_sshort_p(x, GMP_RNDN)) | |
175 ERROR2; | |
176 | |
177 mpfr_set_si(x, 1, GMP_RNDN); | |
178 if (!mpfr_fits_sint_p(x, GMP_RNDN)) | |
179 ERROR2; | |
180 if (!mpfr_fits_sshort_p(x, GMP_RNDN)) | |
181 ERROR2; | |
182 | |
183 /* Check negative value */ | |
184 mpfr_set_si (x, -1, GMP_RNDN); | |
185 if (!mpfr_fits_sint_p(x, GMP_RNDN)) | |
186 ERROR2; | |
187 if (!mpfr_fits_sshort_p(x, GMP_RNDN)) | |
188 ERROR2; | |
189 if (!mpfr_fits_slong_p(x, GMP_RNDN)) | |
190 ERROR2; | |
191 if (mpfr_fits_uint_p(x, GMP_RNDN)) | |
192 ERROR1; | |
193 if (mpfr_fits_ushort_p(x, GMP_RNDN)) | |
194 ERROR1; | |
195 if (mpfr_fits_ulong_p(x, GMP_RNDN)) | |
196 ERROR1; | |
197 | |
198 mpfr_clear (x); | |
199 | |
200 check_intmax (); | |
201 | |
202 tests_end_mpfr (); | |
203 return 0; | |
204 } | |
205 | |
206 static void check_intmax (void) | |
207 { | |
208 #ifdef _MPFR_H_HAVE_INTMAX_T | |
209 mpfr_t x; | |
210 | |
211 mpfr_init2 (x, sizeof(uintmax_t)*CHAR_BIT); | |
212 | |
213 /* Check NAN */ | |
214 mpfr_set_nan(x); | |
215 if (mpfr_fits_uintmax_p(x, GMP_RNDN)) | |
216 ERROR1; | |
217 if (mpfr_fits_intmax_p(x, GMP_RNDN)) | |
218 ERROR1; | |
219 | |
220 /* Check INF */ | |
221 mpfr_set_inf(x, 1); | |
222 if (mpfr_fits_uintmax_p(x, GMP_RNDN)) | |
223 ERROR1; | |
224 if (mpfr_fits_intmax_p(x, GMP_RNDN)) | |
225 ERROR1; | |
226 | |
227 /* Check Zero */ | |
228 MPFR_SET_ZERO(x); | |
229 if (!mpfr_fits_uintmax_p(x, GMP_RNDN)) | |
230 ERROR2; | |
231 if (!mpfr_fits_intmax_p(x, GMP_RNDN)) | |
232 ERROR2; | |
233 | |
234 /* Check small op */ | |
235 mpfr_set_str1 (x, "1@-1"); | |
236 if (!mpfr_fits_uintmax_p(x, GMP_RNDN)) | |
237 ERROR2; | |
238 if (!mpfr_fits_intmax_p(x, GMP_RNDN)) | |
239 ERROR2; | |
240 | |
241 /* Check 17 */ | |
242 mpfr_set_ui (x, 17, GMP_RNDN); | |
243 if (!mpfr_fits_uintmax_p(x, GMP_RNDN)) | |
244 ERROR2; | |
245 if (!mpfr_fits_intmax_p(x, GMP_RNDN)) | |
246 ERROR2; | |
247 | |
248 /* Check hugest */ | |
249 mpfr_set_ui_2exp (x, 42, sizeof (uintmax_t) * 32, GMP_RNDN); | |
250 if (mpfr_fits_uintmax_p (x, GMP_RNDN)) | |
251 ERROR1; | |
252 if (mpfr_fits_intmax_p (x, GMP_RNDN)) | |
253 ERROR1; | |
254 | |
255 /* Check all other values */ | |
256 mpfr_set_uj (x, UINTMAX_MAX, GMP_RNDN); | |
257 mpfr_add_ui (x, x, 1, GMP_RNDN); | |
258 if (mpfr_fits_uintmax_p (x, GMP_RNDN)) | |
259 ERROR1; | |
260 mpfr_set_uj (x, UINTMAX_MAX, GMP_RNDN); | |
261 if (!mpfr_fits_uintmax_p (x, GMP_RNDN)) | |
262 ERROR2; | |
263 mpfr_set_sj (x, INTMAX_MAX, GMP_RNDN); | |
264 mpfr_add_ui (x, x, 1, GMP_RNDN); | |
265 if (mpfr_fits_intmax_p (x, GMP_RNDN)) | |
266 ERROR1; | |
267 mpfr_set_sj (x, INTMAX_MAX, GMP_RNDN); | |
268 if (!mpfr_fits_intmax_p (x, GMP_RNDN)) | |
269 ERROR2; | |
270 mpfr_set_sj (x, INTMAX_MIN, GMP_RNDN); | |
271 if (!mpfr_fits_intmax_p (x, GMP_RNDN)) | |
272 ERROR2; | |
273 mpfr_sub_ui (x, x, 1, GMP_RNDN); | |
274 if (mpfr_fits_intmax_p (x, GMP_RNDN)) | |
275 ERROR1; | |
276 | |
277 /* Check negative value */ | |
278 mpfr_set_si (x, -1, GMP_RNDN); | |
279 if (!mpfr_fits_intmax_p (x, GMP_RNDN)) | |
280 ERROR2; | |
281 if (mpfr_fits_uintmax_p (x, GMP_RNDN)) | |
282 ERROR1; | |
283 | |
284 mpfr_clear (x); | |
285 #endif | |
286 } | |
287 | |
OLD | NEW |