Annotation of /trunk/mpfr/patches/mpfr-3.1.2-p11.patch
Parent Directory | Revision Log
Revision 2570 -
(hide annotations)
(download)
Wed Nov 26 00:39:01 2014 UTC (9 years, 10 months ago) by niro
File size: 56734 byte(s)
Wed Nov 26 00:39:01 2014 UTC (9 years, 10 months ago) by niro
File size: 56734 byte(s)
-all patches up to patchlevel 11
1 | niro | 2570 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES |
2 | --- mpfr-3.1.2-a/PATCHES 2013-09-26 10:52:52.000000000 +0000 | ||
3 | +++ mpfr-3.1.2-b/PATCHES 2013-09-26 10:52:52.000000000 +0000 | ||
4 | @@ -0,0 +1 @@ | ||
5 | +exp_2 | ||
6 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
7 | --- mpfr-3.1.2-a/VERSION 2013-03-13 15:37:28.000000000 +0000 | ||
8 | +++ mpfr-3.1.2-b/VERSION 2013-09-26 10:52:52.000000000 +0000 | ||
9 | @@ -1 +1 @@ | ||
10 | -3.1.2 | ||
11 | +3.1.2-p1 | ||
12 | diff -Naurd mpfr-3.1.2-a/src/exp_2.c mpfr-3.1.2-b/src/exp_2.c | ||
13 | --- mpfr-3.1.2-a/src/exp_2.c 2013-03-13 15:37:28.000000000 +0000 | ||
14 | +++ mpfr-3.1.2-b/src/exp_2.c 2013-09-26 10:52:52.000000000 +0000 | ||
15 | @@ -204,7 +204,7 @@ | ||
16 | for (k = 0; k < K; k++) | ||
17 | { | ||
18 | mpz_mul (ss, ss, ss); | ||
19 | - exps <<= 1; | ||
20 | + exps *= 2; | ||
21 | exps += mpz_normalize (ss, ss, q); | ||
22 | } | ||
23 | mpfr_set_z (s, ss, MPFR_RNDN); | ||
24 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
25 | --- mpfr-3.1.2-a/src/mpfr.h 2013-03-13 15:37:37.000000000 +0000 | ||
26 | +++ mpfr-3.1.2-b/src/mpfr.h 2013-09-26 10:52:52.000000000 +0000 | ||
27 | @@ -27,7 +27,7 @@ | ||
28 | #define MPFR_VERSION_MAJOR 3 | ||
29 | #define MPFR_VERSION_MINOR 1 | ||
30 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
31 | -#define MPFR_VERSION_STRING "3.1.2" | ||
32 | +#define MPFR_VERSION_STRING "3.1.2-p1" | ||
33 | |||
34 | /* Macros dealing with MPFR VERSION */ | ||
35 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
36 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
37 | --- mpfr-3.1.2-a/src/version.c 2013-03-13 15:37:34.000000000 +0000 | ||
38 | +++ mpfr-3.1.2-b/src/version.c 2013-09-26 10:52:52.000000000 +0000 | ||
39 | @@ -25,5 +25,5 @@ | ||
40 | const char * | ||
41 | mpfr_get_version (void) | ||
42 | { | ||
43 | - return "3.1.2"; | ||
44 | + return "3.1.2-p1"; | ||
45 | } | ||
46 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
47 | --- mpfr-3.1.2-a/PATCHES 2013-09-26 10:56:55.000000000 +0000 | ||
48 | +++ mpfr-3.1.2-b/PATCHES 2013-09-26 10:56:55.000000000 +0000 | ||
49 | @@ -0,0 +1 @@ | ||
50 | +fits-smallneg | ||
51 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
52 | --- mpfr-3.1.2-a/VERSION 2013-09-26 10:52:52.000000000 +0000 | ||
53 | +++ mpfr-3.1.2-b/VERSION 2013-09-26 10:56:55.000000000 +0000 | ||
54 | @@ -1 +1 @@ | ||
55 | -3.1.2-p1 | ||
56 | +3.1.2-p2 | ||
57 | diff -Naurd mpfr-3.1.2-a/src/fits_u.h mpfr-3.1.2-b/src/fits_u.h | ||
58 | --- mpfr-3.1.2-a/src/fits_u.h 2013-03-13 15:37:35.000000000 +0000 | ||
59 | +++ mpfr-3.1.2-b/src/fits_u.h 2013-09-26 10:56:55.000000000 +0000 | ||
60 | @@ -32,17 +32,20 @@ | ||
61 | int res; | ||
62 | |||
63 | if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (f))) | ||
64 | - /* Zero always fit */ | ||
65 | - return MPFR_IS_ZERO (f) ? 1 : 0; | ||
66 | - else if (MPFR_IS_NEG (f)) | ||
67 | - /* Negative numbers don't fit */ | ||
68 | - return 0; | ||
69 | - /* now it fits if | ||
70 | - (a) f <= MAXIMUM | ||
71 | - (b) round(f, prec(slong), rnd) <= MAXIMUM */ | ||
72 | + return MPFR_IS_ZERO (f) ? 1 : 0; /* Zero always fits */ | ||
73 | |||
74 | e = MPFR_GET_EXP (f); | ||
75 | |||
76 | + if (MPFR_IS_NEG (f)) | ||
77 | + return e >= 1 ? 0 /* f <= -1 does not fit */ | ||
78 | + : rnd != MPFR_RNDN ? MPFR_IS_LIKE_RNDU (rnd, -1) /* directed mode */ | ||
79 | + : e < 0 ? 1 /* f > -1/2 fits in MPFR_RNDN */ | ||
80 | + : mpfr_powerof2_raw(f); /* -1/2 fits, -1 < f < -1/2 don't */ | ||
81 | + | ||
82 | + /* Now it fits if | ||
83 | + (a) f <= MAXIMUM | ||
84 | + (b) round(f, prec(slong), rnd) <= MAXIMUM */ | ||
85 | + | ||
86 | /* first compute prec(MAXIMUM); fits in an int */ | ||
87 | for (s = MAXIMUM, prec = 0; s != 0; s /= 2, prec ++); | ||
88 | |||
89 | diff -Naurd mpfr-3.1.2-a/src/fits_uintmax.c mpfr-3.1.2-b/src/fits_uintmax.c | ||
90 | --- mpfr-3.1.2-a/src/fits_uintmax.c 2013-03-13 15:37:33.000000000 +0000 | ||
91 | +++ mpfr-3.1.2-b/src/fits_uintmax.c 2013-09-26 10:56:55.000000000 +0000 | ||
92 | @@ -27,51 +27,19 @@ | ||
93 | #include "mpfr-intmax.h" | ||
94 | #include "mpfr-impl.h" | ||
95 | |||
96 | -#ifdef _MPFR_H_HAVE_INTMAX_T | ||
97 | - | ||
98 | -/* We can't use fits_u.h <= mpfr_cmp_ui */ | ||
99 | -int | ||
100 | -mpfr_fits_uintmax_p (mpfr_srcptr f, mpfr_rnd_t rnd) | ||
101 | -{ | ||
102 | - mpfr_exp_t e; | ||
103 | - int prec; | ||
104 | - uintmax_t s; | ||
105 | - mpfr_t x; | ||
106 | - int res; | ||
107 | - | ||
108 | - if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (f))) | ||
109 | - /* Zero always fit */ | ||
110 | - return MPFR_IS_ZERO (f) ? 1 : 0; | ||
111 | - else if (MPFR_IS_NEG (f)) | ||
112 | - /* Negative numbers don't fit */ | ||
113 | - return 0; | ||
114 | - /* now it fits if | ||
115 | - (a) f <= MAXIMUM | ||
116 | - (b) round(f, prec(slong), rnd) <= MAXIMUM */ | ||
117 | - | ||
118 | - e = MPFR_GET_EXP (f); | ||
119 | - | ||
120 | - /* first compute prec(MAXIMUM); fits in an int */ | ||
121 | - for (s = MPFR_UINTMAX_MAX, prec = 0; s != 0; s /= 2, prec ++); | ||
122 | - | ||
123 | - /* MAXIMUM needs prec bits, i.e. MAXIMUM = 2^prec - 1 */ | ||
124 | - | ||
125 | - /* if e <= prec - 1, then f < 2^(prec-1) < MAXIMUM */ | ||
126 | - if (e <= prec - 1) | ||
127 | - return 1; | ||
128 | +/* Note: though mpfr-impl.h is included in fits_u.h, we also include it | ||
129 | + above so that it gets included even when _MPFR_H_HAVE_INTMAX_T is not | ||
130 | + defined; this is necessary to avoid an empty translation unit, which | ||
131 | + is forbidden by ISO C. Without this, a failing test can be reproduced | ||
132 | + by creating an invalid stdint.h somewhere in the default include path | ||
133 | + and by compiling MPFR with "gcc -ansi -pedantic-errors". */ | ||
134 | |||
135 | - /* if e >= prec + 1, then f >= 2^prec > MAXIMUM */ | ||
136 | - if (e >= prec + 1) | ||
137 | - return 0; | ||
138 | +#ifdef _MPFR_H_HAVE_INTMAX_T | ||
139 | |||
140 | - MPFR_ASSERTD (e == prec); | ||
141 | +#define FUNCTION mpfr_fits_uintmax_p | ||
142 | +#define MAXIMUM MPFR_UINTMAX_MAX | ||
143 | +#define TYPE uintmax_t | ||
144 | |||
145 | - /* hard case: first round to prec bits, then check */ | ||
146 | - mpfr_init2 (x, prec); | ||
147 | - mpfr_set (x, f, rnd); | ||
148 | - res = MPFR_GET_EXP (x) == e; | ||
149 | - mpfr_clear (x); | ||
150 | - return res; | ||
151 | -} | ||
152 | +#include "fits_u.h" | ||
153 | |||
154 | #endif | ||
155 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
156 | --- mpfr-3.1.2-a/src/mpfr.h 2013-09-26 10:52:52.000000000 +0000 | ||
157 | +++ mpfr-3.1.2-b/src/mpfr.h 2013-09-26 10:56:55.000000000 +0000 | ||
158 | @@ -27,7 +27,7 @@ | ||
159 | #define MPFR_VERSION_MAJOR 3 | ||
160 | #define MPFR_VERSION_MINOR 1 | ||
161 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
162 | -#define MPFR_VERSION_STRING "3.1.2-p1" | ||
163 | +#define MPFR_VERSION_STRING "3.1.2-p2" | ||
164 | |||
165 | /* Macros dealing with MPFR VERSION */ | ||
166 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
167 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
168 | --- mpfr-3.1.2-a/src/version.c 2013-09-26 10:52:52.000000000 +0000 | ||
169 | +++ mpfr-3.1.2-b/src/version.c 2013-09-26 10:56:55.000000000 +0000 | ||
170 | @@ -25,5 +25,5 @@ | ||
171 | const char * | ||
172 | mpfr_get_version (void) | ||
173 | { | ||
174 | - return "3.1.2-p1"; | ||
175 | + return "3.1.2-p2"; | ||
176 | } | ||
177 | diff -Naurd mpfr-3.1.2-a/tests/tfits.c mpfr-3.1.2-b/tests/tfits.c | ||
178 | --- mpfr-3.1.2-a/tests/tfits.c 2013-03-13 15:37:45.000000000 +0000 | ||
179 | +++ mpfr-3.1.2-b/tests/tfits.c 2013-09-26 10:56:55.000000000 +0000 | ||
180 | @@ -33,155 +33,176 @@ | ||
181 | #include "mpfr-intmax.h" | ||
182 | #include "mpfr-test.h" | ||
183 | |||
184 | -#define ERROR1 { printf("Initial error for x="); mpfr_dump(x); exit(1); } | ||
185 | -#define ERROR2 { printf("Error for x="); mpfr_dump(x); exit(1); } | ||
186 | +#define ERROR1(N) \ | ||
187 | + do \ | ||
188 | + { \ | ||
189 | + printf("Error %d for rnd = %s and x = ", N, \ | ||
190 | + mpfr_print_rnd_mode ((mpfr_rnd_t) r)); \ | ||
191 | + mpfr_dump(x); \ | ||
192 | + exit(1); \ | ||
193 | + } \ | ||
194 | + while (0) | ||
195 | |||
196 | static void check_intmax (void); | ||
197 | |||
198 | int | ||
199 | main (void) | ||
200 | { | ||
201 | - mpfr_t x; | ||
202 | + mpfr_t x, y; | ||
203 | + int i, r; | ||
204 | |||
205 | tests_start_mpfr (); | ||
206 | |||
207 | mpfr_init2 (x, 256); | ||
208 | + mpfr_init2 (y, 8); | ||
209 | |||
210 | - /* Check NAN */ | ||
211 | - mpfr_set_nan (x); | ||
212 | - if (mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
213 | - ERROR1; | ||
214 | - if (mpfr_fits_slong_p (x, MPFR_RNDN)) | ||
215 | - ERROR1; | ||
216 | - if (mpfr_fits_uint_p (x, MPFR_RNDN)) | ||
217 | - ERROR1; | ||
218 | - if (mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
219 | - ERROR1; | ||
220 | - if (mpfr_fits_ushort_p (x, MPFR_RNDN)) | ||
221 | - ERROR1; | ||
222 | - if (mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
223 | - ERROR1; | ||
224 | + RND_LOOP (r) | ||
225 | + { | ||
226 | |||
227 | - /* Check INF */ | ||
228 | - mpfr_set_inf (x, 1); | ||
229 | - if (mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
230 | - ERROR1; | ||
231 | - if (mpfr_fits_slong_p (x, MPFR_RNDN)) | ||
232 | - ERROR1; | ||
233 | - if (mpfr_fits_uint_p (x, MPFR_RNDN)) | ||
234 | - ERROR1; | ||
235 | - if (mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
236 | - ERROR1; | ||
237 | - if (mpfr_fits_ushort_p (x, MPFR_RNDN)) | ||
238 | - ERROR1; | ||
239 | - if (mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
240 | - ERROR1; | ||
241 | + /* Check NAN */ | ||
242 | + mpfr_set_nan (x); | ||
243 | + if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) | ||
244 | + ERROR1 (1); | ||
245 | + if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) | ||
246 | + ERROR1 (2); | ||
247 | + if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) | ||
248 | + ERROR1 (3); | ||
249 | + if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
250 | + ERROR1 (4); | ||
251 | + if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) | ||
252 | + ERROR1 (5); | ||
253 | + if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
254 | + ERROR1 (6); | ||
255 | |||
256 | - /* Check Zero */ | ||
257 | - MPFR_SET_ZERO (x); | ||
258 | - if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
259 | - ERROR2; | ||
260 | - if (!mpfr_fits_slong_p (x, MPFR_RNDN)) | ||
261 | - ERROR2; | ||
262 | - if (!mpfr_fits_uint_p (x, MPFR_RNDN)) | ||
263 | - ERROR2; | ||
264 | - if (!mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
265 | - ERROR2; | ||
266 | - if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) | ||
267 | - ERROR2; | ||
268 | - if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
269 | - ERROR2; | ||
270 | + /* Check INF */ | ||
271 | + mpfr_set_inf (x, 1); | ||
272 | + if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) | ||
273 | + ERROR1 (7); | ||
274 | + if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) | ||
275 | + ERROR1 (8); | ||
276 | + if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) | ||
277 | + ERROR1 (9); | ||
278 | + if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
279 | + ERROR1 (10); | ||
280 | + if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) | ||
281 | + ERROR1 (11); | ||
282 | + if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
283 | + ERROR1 (12); | ||
284 | |||
285 | - /* Check small op */ | ||
286 | - mpfr_set_str1 (x, "1@-1"); | ||
287 | - if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
288 | - ERROR2; | ||
289 | - if (!mpfr_fits_slong_p (x, MPFR_RNDN)) | ||
290 | - ERROR2; | ||
291 | - if (!mpfr_fits_uint_p (x, MPFR_RNDN)) | ||
292 | - ERROR2; | ||
293 | - if (!mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
294 | - ERROR2; | ||
295 | - if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) | ||
296 | - ERROR2; | ||
297 | - if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
298 | - ERROR2; | ||
299 | + /* Check Zero */ | ||
300 | + MPFR_SET_ZERO (x); | ||
301 | + if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) | ||
302 | + ERROR1 (13); | ||
303 | + if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) | ||
304 | + ERROR1 (14); | ||
305 | + if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) | ||
306 | + ERROR1 (15); | ||
307 | + if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
308 | + ERROR1 (16); | ||
309 | + if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) | ||
310 | + ERROR1 (17); | ||
311 | + if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
312 | + ERROR1 (18); | ||
313 | |||
314 | - /* Check 17 */ | ||
315 | - mpfr_set_ui (x, 17, MPFR_RNDN); | ||
316 | - if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
317 | - ERROR2; | ||
318 | - if (!mpfr_fits_slong_p (x, MPFR_RNDN)) | ||
319 | - ERROR2; | ||
320 | - if (!mpfr_fits_uint_p (x, MPFR_RNDN)) | ||
321 | - ERROR2; | ||
322 | - if (!mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
323 | - ERROR2; | ||
324 | - if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) | ||
325 | - ERROR2; | ||
326 | - if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
327 | - ERROR2; | ||
328 | + /* Check small positive op */ | ||
329 | + mpfr_set_str1 (x, "1@-1"); | ||
330 | + if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) | ||
331 | + ERROR1 (19); | ||
332 | + if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) | ||
333 | + ERROR1 (20); | ||
334 | + if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) | ||
335 | + ERROR1 (21); | ||
336 | + if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
337 | + ERROR1 (22); | ||
338 | + if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) | ||
339 | + ERROR1 (23); | ||
340 | + if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
341 | + ERROR1 (24); | ||
342 | |||
343 | - /* Check all other values */ | ||
344 | - mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); | ||
345 | - mpfr_mul_2exp (x, x, 1, MPFR_RNDN); | ||
346 | - if (mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
347 | - ERROR1; | ||
348 | - if (mpfr_fits_slong_p (x, MPFR_RNDN)) | ||
349 | - ERROR1; | ||
350 | - mpfr_mul_2exp (x, x, 40, MPFR_RNDN); | ||
351 | - if (mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
352 | - ERROR1; | ||
353 | - if (mpfr_fits_uint_p (x, MPFR_RNDN)) | ||
354 | - ERROR1; | ||
355 | - if (mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
356 | - ERROR1; | ||
357 | - if (mpfr_fits_ushort_p (x, MPFR_RNDN)) | ||
358 | - ERROR1; | ||
359 | - if (mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
360 | - ERROR1; | ||
361 | + /* Check 17 */ | ||
362 | + mpfr_set_ui (x, 17, MPFR_RNDN); | ||
363 | + if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) | ||
364 | + ERROR1 (25); | ||
365 | + if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) | ||
366 | + ERROR1 (26); | ||
367 | + if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) | ||
368 | + ERROR1 (27); | ||
369 | + if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
370 | + ERROR1 (28); | ||
371 | + if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) | ||
372 | + ERROR1 (29); | ||
373 | + if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
374 | + ERROR1 (30); | ||
375 | |||
376 | - mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); | ||
377 | - if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
378 | - ERROR2; | ||
379 | - mpfr_set_ui (x, LONG_MAX, MPFR_RNDN); | ||
380 | - if (!mpfr_fits_slong_p (x, MPFR_RNDN)) | ||
381 | - ERROR2; | ||
382 | - mpfr_set_ui (x, UINT_MAX, MPFR_RNDN); | ||
383 | - if (!mpfr_fits_uint_p (x, MPFR_RNDN)) | ||
384 | - ERROR2; | ||
385 | - mpfr_set_ui (x, INT_MAX, MPFR_RNDN); | ||
386 | - if (!mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
387 | - ERROR2; | ||
388 | - mpfr_set_ui (x, USHRT_MAX, MPFR_RNDN); | ||
389 | - if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) | ||
390 | - ERROR2; | ||
391 | - mpfr_set_ui (x, SHRT_MAX, MPFR_RNDN); | ||
392 | - if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
393 | - ERROR2; | ||
394 | + /* Check all other values */ | ||
395 | + mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); | ||
396 | + mpfr_mul_2exp (x, x, 1, MPFR_RNDN); | ||
397 | + if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) | ||
398 | + ERROR1 (31); | ||
399 | + if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) | ||
400 | + ERROR1 (32); | ||
401 | + mpfr_mul_2exp (x, x, 40, MPFR_RNDN); | ||
402 | + if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) | ||
403 | + ERROR1 (33); | ||
404 | + if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) | ||
405 | + ERROR1 (34); | ||
406 | + if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
407 | + ERROR1 (35); | ||
408 | + if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) | ||
409 | + ERROR1 (36); | ||
410 | + if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
411 | + ERROR1 (37); | ||
412 | |||
413 | - mpfr_set_si (x, 1, MPFR_RNDN); | ||
414 | - if (!mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
415 | - ERROR2; | ||
416 | - if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
417 | - ERROR2; | ||
418 | + mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); | ||
419 | + if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) | ||
420 | + ERROR1 (38); | ||
421 | + mpfr_set_ui (x, LONG_MAX, MPFR_RNDN); | ||
422 | + if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) | ||
423 | + ERROR1 (39); | ||
424 | + mpfr_set_ui (x, UINT_MAX, MPFR_RNDN); | ||
425 | + if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) | ||
426 | + ERROR1 (40); | ||
427 | + mpfr_set_ui (x, INT_MAX, MPFR_RNDN); | ||
428 | + if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
429 | + ERROR1 (41); | ||
430 | + mpfr_set_ui (x, USHRT_MAX, MPFR_RNDN); | ||
431 | + if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) | ||
432 | + ERROR1 (42); | ||
433 | + mpfr_set_ui (x, SHRT_MAX, MPFR_RNDN); | ||
434 | + if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
435 | + ERROR1 (43); | ||
436 | |||
437 | - /* Check negative value */ | ||
438 | - mpfr_set_si (x, -1, MPFR_RNDN); | ||
439 | - if (!mpfr_fits_sint_p (x, MPFR_RNDN)) | ||
440 | - ERROR2; | ||
441 | - if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) | ||
442 | - ERROR2; | ||
443 | - if (!mpfr_fits_slong_p (x, MPFR_RNDN)) | ||
444 | - ERROR2; | ||
445 | - if (mpfr_fits_uint_p (x, MPFR_RNDN)) | ||
446 | - ERROR1; | ||
447 | - if (mpfr_fits_ushort_p (x, MPFR_RNDN)) | ||
448 | - ERROR1; | ||
449 | - if (mpfr_fits_ulong_p (x, MPFR_RNDN)) | ||
450 | - ERROR1; | ||
451 | + mpfr_set_si (x, 1, MPFR_RNDN); | ||
452 | + if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
453 | + ERROR1 (44); | ||
454 | + if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
455 | + ERROR1 (45); | ||
456 | + | ||
457 | + /* Check negative op */ | ||
458 | + for (i = 1; i <= 4; i++) | ||
459 | + { | ||
460 | + int inv; | ||
461 | + | ||
462 | + mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN); | ||
463 | + mpfr_rint (y, x, (mpfr_rnd_t) r); | ||
464 | + inv = MPFR_NOTZERO (y); | ||
465 | + if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r) ^ inv) | ||
466 | + ERROR1 (46); | ||
467 | + if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) | ||
468 | + ERROR1 (47); | ||
469 | + if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r) ^ inv) | ||
470 | + ERROR1 (48); | ||
471 | + if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) | ||
472 | + ERROR1 (49); | ||
473 | + if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r) ^ inv) | ||
474 | + ERROR1 (50); | ||
475 | + if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) | ||
476 | + ERROR1 (51); | ||
477 | + } | ||
478 | + } | ||
479 | |||
480 | mpfr_clear (x); | ||
481 | + mpfr_clear (y); | ||
482 | |||
483 | check_intmax (); | ||
484 | |||
485 | @@ -189,85 +210,98 @@ | ||
486 | return 0; | ||
487 | } | ||
488 | |||
489 | -static void check_intmax (void) | ||
490 | +static void | ||
491 | +check_intmax (void) | ||
492 | { | ||
493 | #ifdef _MPFR_H_HAVE_INTMAX_T | ||
494 | - mpfr_t x; | ||
495 | + mpfr_t x, y; | ||
496 | + int i, r; | ||
497 | |||
498 | - mpfr_init2 (x, sizeof (uintmax_t)*CHAR_BIT); | ||
499 | + mpfr_init2 (x, sizeof (uintmax_t) * CHAR_BIT); | ||
500 | + mpfr_init2 (y, 8); | ||
501 | |||
502 | - /* Check NAN */ | ||
503 | - mpfr_set_nan (x); | ||
504 | - if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
505 | - ERROR1; | ||
506 | - if (mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
507 | - ERROR1; | ||
508 | + RND_LOOP (r) | ||
509 | + { | ||
510 | + /* Check NAN */ | ||
511 | + mpfr_set_nan (x); | ||
512 | + if (mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) | ||
513 | + ERROR1 (52); | ||
514 | + if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
515 | + ERROR1 (53); | ||
516 | |||
517 | - /* Check INF */ | ||
518 | - mpfr_set_inf (x, 1); | ||
519 | - if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
520 | - ERROR1; | ||
521 | - if (mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
522 | - ERROR1; | ||
523 | + /* Check INF */ | ||
524 | + mpfr_set_inf (x, 1); | ||
525 | + if (mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) | ||
526 | + ERROR1 (54); | ||
527 | + if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
528 | + ERROR1 (55); | ||
529 | |||
530 | - /* Check Zero */ | ||
531 | - MPFR_SET_ZERO (x); | ||
532 | - if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
533 | - ERROR2; | ||
534 | - if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
535 | - ERROR2; | ||
536 | + /* Check Zero */ | ||
537 | + MPFR_SET_ZERO (x); | ||
538 | + if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) | ||
539 | + ERROR1 (56); | ||
540 | + if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
541 | + ERROR1 (57); | ||
542 | |||
543 | - /* Check small op */ | ||
544 | - mpfr_set_str1 (x, "1@-1"); | ||
545 | - if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
546 | - ERROR2; | ||
547 | - if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
548 | - ERROR2; | ||
549 | + /* Check positive small op */ | ||
550 | + mpfr_set_str1 (x, "1@-1"); | ||
551 | + if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) | ||
552 | + ERROR1 (58); | ||
553 | + if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
554 | + ERROR1 (59); | ||
555 | |||
556 | - /* Check 17 */ | ||
557 | - mpfr_set_ui (x, 17, MPFR_RNDN); | ||
558 | - if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
559 | - ERROR2; | ||
560 | - if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
561 | - ERROR2; | ||
562 | + /* Check 17 */ | ||
563 | + mpfr_set_ui (x, 17, MPFR_RNDN); | ||
564 | + if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) | ||
565 | + ERROR1 (60); | ||
566 | + if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
567 | + ERROR1 (61); | ||
568 | |||
569 | - /* Check hugest */ | ||
570 | - mpfr_set_ui_2exp (x, 42, sizeof (uintmax_t) * 32, MPFR_RNDN); | ||
571 | - if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
572 | - ERROR1; | ||
573 | - if (mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
574 | - ERROR1; | ||
575 | + /* Check hugest */ | ||
576 | + mpfr_set_ui_2exp (x, 42, sizeof (uintmax_t) * 32, MPFR_RNDN); | ||
577 | + if (mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) | ||
578 | + ERROR1 (62); | ||
579 | + if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
580 | + ERROR1 (63); | ||
581 | |||
582 | - /* Check all other values */ | ||
583 | - mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); | ||
584 | - mpfr_add_ui (x, x, 1, MPFR_RNDN); | ||
585 | - if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
586 | - ERROR1; | ||
587 | - mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); | ||
588 | - if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
589 | - ERROR2; | ||
590 | - mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); | ||
591 | - mpfr_add_ui (x, x, 1, MPFR_RNDN); | ||
592 | - if (mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
593 | - ERROR1; | ||
594 | - mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); | ||
595 | - if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
596 | - ERROR2; | ||
597 | - mpfr_set_sj (x, MPFR_INTMAX_MIN, MPFR_RNDN); | ||
598 | - if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
599 | - ERROR2; | ||
600 | - mpfr_sub_ui (x, x, 1, MPFR_RNDN); | ||
601 | - if (mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
602 | - ERROR1; | ||
603 | + /* Check all other values */ | ||
604 | + mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); | ||
605 | + mpfr_add_ui (x, x, 1, MPFR_RNDN); | ||
606 | + if (mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) | ||
607 | + ERROR1 (64); | ||
608 | + mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); | ||
609 | + if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) | ||
610 | + ERROR1 (65); | ||
611 | + mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); | ||
612 | + mpfr_add_ui (x, x, 1, MPFR_RNDN); | ||
613 | + if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
614 | + ERROR1 (66); | ||
615 | + mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); | ||
616 | + if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
617 | + ERROR1 (67); | ||
618 | + mpfr_set_sj (x, MPFR_INTMAX_MIN, MPFR_RNDN); | ||
619 | + if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
620 | + ERROR1 (68); | ||
621 | + mpfr_sub_ui (x, x, 1, MPFR_RNDN); | ||
622 | + if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
623 | + ERROR1 (69); | ||
624 | |||
625 | - /* Check negative value */ | ||
626 | - mpfr_set_si (x, -1, MPFR_RNDN); | ||
627 | - if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) | ||
628 | - ERROR2; | ||
629 | - if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) | ||
630 | - ERROR1; | ||
631 | + /* Check negative op */ | ||
632 | + for (i = 1; i <= 4; i++) | ||
633 | + { | ||
634 | + int inv; | ||
635 | + | ||
636 | + mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN); | ||
637 | + mpfr_rint (y, x, (mpfr_rnd_t) r); | ||
638 | + inv = MPFR_NOTZERO (y); | ||
639 | + if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r) ^ inv) | ||
640 | + ERROR1 (70); | ||
641 | + if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) | ||
642 | + ERROR1 (71); | ||
643 | + } | ||
644 | + } | ||
645 | |||
646 | mpfr_clear (x); | ||
647 | + mpfr_clear (y); | ||
648 | #endif | ||
649 | } | ||
650 | - | ||
651 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
652 | --- mpfr-3.1.2-a/PATCHES 2013-10-09 13:34:21.000000000 +0000 | ||
653 | +++ mpfr-3.1.2-b/PATCHES 2013-10-09 13:34:21.000000000 +0000 | ||
654 | @@ -0,0 +1 @@ | ||
655 | +clang-divby0 | ||
656 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
657 | --- mpfr-3.1.2-a/VERSION 2013-09-26 10:52:52.000000000 +0000 | ||
658 | +++ mpfr-3.1.2-b/VERSION 2013-10-09 13:34:21.000000000 +0000 | ||
659 | @@ -1 +1 @@ | ||
660 | -3.1.2-p2 | ||
661 | +3.1.2-p3 | ||
662 | diff -Naurd mpfr-3.1.2-a/src/mpfr-impl.h mpfr-3.1.2-b/src/mpfr-impl.h | ||
663 | --- mpfr-3.1.2-a/src/mpfr-impl.h 2013-03-13 15:37:36.000000000 +0000 | ||
664 | +++ mpfr-3.1.2-b/src/mpfr-impl.h 2013-10-09 13:34:21.000000000 +0000 | ||
665 | @@ -468,8 +468,16 @@ | ||
666 | #define MPFR_LIMBS_PER_FLT ((IEEE_FLT_MANT_DIG-1)/GMP_NUMB_BITS+1) | ||
667 | |||
668 | /* Visual C++ doesn't support +1.0/0.0, -1.0/0.0 and 0.0/0.0 | ||
669 | - at compile time. */ | ||
670 | -#if defined(_MSC_VER) && defined(_WIN32) && (_MSC_VER >= 1200) | ||
671 | + at compile time. | ||
672 | + Clang with -fsanitize=undefined is a bit similar due to a bug: | ||
673 | + http://llvm.org/bugs/show_bug.cgi?id=17381 | ||
674 | + but even without its sanitizer, it may be better to use the | ||
675 | + double_zero version until IEEE 754 division by zero is properly | ||
676 | + supported: | ||
677 | + http://llvm.org/bugs/show_bug.cgi?id=17000 | ||
678 | +*/ | ||
679 | +#if (defined(_MSC_VER) && defined(_WIN32) && (_MSC_VER >= 1200)) || \ | ||
680 | + defined(__clang__) | ||
681 | static double double_zero = 0.0; | ||
682 | # define DBL_NAN (double_zero/double_zero) | ||
683 | # define DBL_POS_INF ((double) 1.0/double_zero) | ||
684 | @@ -501,6 +509,8 @@ | ||
685 | (with Xcode 2.4.1, i.e. the latest one). */ | ||
686 | #define LVALUE(x) (&(x) == &(x) || &(x) != &(x)) | ||
687 | #define DOUBLE_ISINF(x) (LVALUE(x) && ((x) > DBL_MAX || (x) < -DBL_MAX)) | ||
688 | +/* The DOUBLE_ISNAN(x) macro is also valid on long double x | ||
689 | + (assuming that the compiler isn't too broken). */ | ||
690 | #ifdef MPFR_NANISNAN | ||
691 | /* Avoid MIPSpro / IRIX64 / gcc -ffast-math (incorrect) optimizations. | ||
692 | The + must not be replaced by a ||. With gcc -ffast-math, NaN is | ||
693 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
694 | --- mpfr-3.1.2-a/src/mpfr.h 2013-09-26 10:52:52.000000000 +0000 | ||
695 | +++ mpfr-3.1.2-b/src/mpfr.h 2013-10-09 13:34:21.000000000 +0000 | ||
696 | @@ -27,7 +27,7 @@ | ||
697 | #define MPFR_VERSION_MAJOR 3 | ||
698 | #define MPFR_VERSION_MINOR 1 | ||
699 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
700 | -#define MPFR_VERSION_STRING "3.1.2-p2" | ||
701 | +#define MPFR_VERSION_STRING "3.1.2-p3" | ||
702 | |||
703 | /* Macros dealing with MPFR VERSION */ | ||
704 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
705 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
706 | --- mpfr-3.1.2-a/src/version.c 2013-09-26 10:52:52.000000000 +0000 | ||
707 | +++ mpfr-3.1.2-b/src/version.c 2013-10-09 13:34:21.000000000 +0000 | ||
708 | @@ -25,5 +25,5 @@ | ||
709 | const char * | ||
710 | mpfr_get_version (void) | ||
711 | { | ||
712 | - return "3.1.2-p2"; | ||
713 | + return "3.1.2-p3"; | ||
714 | } | ||
715 | diff -Naurd mpfr-3.1.2-a/tests/tget_flt.c mpfr-3.1.2-b/tests/tget_flt.c | ||
716 | --- mpfr-3.1.2-a/tests/tget_flt.c 2013-03-13 15:37:44.000000000 +0000 | ||
717 | +++ mpfr-3.1.2-b/tests/tget_flt.c 2013-10-09 13:34:21.000000000 +0000 | ||
718 | @@ -28,9 +28,17 @@ | ||
719 | main (void) | ||
720 | { | ||
721 | mpfr_t x, y; | ||
722 | - float f, g, infp; | ||
723 | + float f, g; | ||
724 | int i; | ||
725 | +#if !defined(MPFR_ERRDIVZERO) | ||
726 | + float infp; | ||
727 | +#endif | ||
728 | + | ||
729 | + tests_start_mpfr (); | ||
730 | |||
731 | +#if !defined(MPFR_ERRDIVZERO) | ||
732 | + /* The definition of DBL_POS_INF involves a division by 0. This makes | ||
733 | + "clang -O2 -fsanitize=undefined -fno-sanitize-recover" fail. */ | ||
734 | infp = (float) DBL_POS_INF; | ||
735 | if (infp * 0.5 != infp) | ||
736 | { | ||
737 | @@ -38,8 +46,7 @@ | ||
738 | fprintf (stderr, "(this is probably a compiler bug, please report)\n"); | ||
739 | exit (1); | ||
740 | } | ||
741 | - | ||
742 | - tests_start_mpfr (); | ||
743 | +#endif | ||
744 | |||
745 | mpfr_init2 (x, 24); | ||
746 | mpfr_init2 (y, 24); | ||
747 | @@ -353,6 +360,7 @@ | ||
748 | printf ("expected %.8e, got %.8e\n", g, f); | ||
749 | exit (1); | ||
750 | } | ||
751 | +#if !defined(MPFR_ERRDIVZERO) | ||
752 | f = mpfr_get_flt (x, MPFR_RNDN); /* first round to 2^128 (even rule), | ||
753 | thus we should get +Inf */ | ||
754 | g = infp; | ||
755 | @@ -376,6 +384,7 @@ | ||
756 | printf ("expected %.8e, got %.8e\n", g, f); | ||
757 | exit (1); | ||
758 | } | ||
759 | +#endif | ||
760 | |||
761 | mpfr_clear (x); | ||
762 | mpfr_clear (y); | ||
763 | diff -Naurd mpfr-3.1.2-a/tests/tset_ld.c mpfr-3.1.2-b/tests/tset_ld.c | ||
764 | --- mpfr-3.1.2-a/tests/tset_ld.c 2013-03-13 15:37:44.000000000 +0000 | ||
765 | +++ mpfr-3.1.2-b/tests/tset_ld.c 2013-10-09 13:34:21.000000000 +0000 | ||
766 | @@ -47,8 +47,11 @@ | ||
767 | static int | ||
768 | Isnan_ld (long double d) | ||
769 | { | ||
770 | - double e = (double) d; | ||
771 | - if (DOUBLE_ISNAN (e)) | ||
772 | + /* Do not convert d to double as this can give an overflow, which | ||
773 | + may confuse compilers without IEEE 754 support (such as clang | ||
774 | + -fsanitize=undefined), or trigger a trap if enabled. | ||
775 | + The DOUBLE_ISNAN macro should work fine on long double. */ | ||
776 | + if (DOUBLE_ISNAN (d)) | ||
777 | return 1; | ||
778 | LONGDOUBLE_NAN_ACTION (d, goto yes); | ||
779 | return 0; | ||
780 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
781 | --- mpfr-3.1.2-a/PATCHES 2013-11-15 00:51:49.211333830 +0000 | ||
782 | +++ mpfr-3.1.2-b/PATCHES 2013-11-15 00:51:49.323334999 +0000 | ||
783 | @@ -0,0 +1 @@ | ||
784 | +printf-alt0 | ||
785 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
786 | --- mpfr-3.1.2-a/VERSION 2013-11-15 00:51:49.211333830 +0000 | ||
787 | +++ mpfr-3.1.2-b/VERSION 2013-11-15 00:51:49.323334999 +0000 | ||
788 | @@ -1 +1 @@ | ||
789 | -3.1.2-p3 | ||
790 | +3.1.2-p4 | ||
791 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
792 | --- mpfr-3.1.2-a/src/mpfr.h 2013-11-15 00:51:49.211333830 +0000 | ||
793 | +++ mpfr-3.1.2-b/src/mpfr.h 2013-11-15 00:51:49.323334999 +0000 | ||
794 | @@ -27,7 +27,7 @@ | ||
795 | #define MPFR_VERSION_MAJOR 3 | ||
796 | #define MPFR_VERSION_MINOR 1 | ||
797 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
798 | -#define MPFR_VERSION_STRING "3.1.2-p3" | ||
799 | +#define MPFR_VERSION_STRING "3.1.2-p4" | ||
800 | |||
801 | /* Macros dealing with MPFR VERSION */ | ||
802 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
803 | diff -Naurd mpfr-3.1.2-a/src/vasprintf.c mpfr-3.1.2-b/src/vasprintf.c | ||
804 | --- mpfr-3.1.2-a/src/vasprintf.c 2013-03-13 15:37:37.000000000 +0000 | ||
805 | +++ mpfr-3.1.2-b/src/vasprintf.c 2013-11-15 00:51:49.267334408 +0000 | ||
806 | @@ -1040,7 +1040,7 @@ | ||
807 | } | ||
808 | |||
809 | /* Determine the different parts of the string representation of the regular | ||
810 | - number P when SPEC.SPEC is 'e', 'E', 'g', or 'G'. | ||
811 | + number P when spec.spec is 'e', 'E', 'g', or 'G'. | ||
812 | DEC_INFO contains the previously computed exponent and string or is NULL. | ||
813 | |||
814 | return -1 if some field > INT_MAX */ | ||
815 | @@ -1167,7 +1167,7 @@ | ||
816 | } | ||
817 | |||
818 | /* Determine the different parts of the string representation of the regular | ||
819 | - number P when SPEC.SPEC is 'f', 'F', 'g', or 'G'. | ||
820 | + number P when spec.spec is 'f', 'F', 'g', or 'G'. | ||
821 | DEC_INFO contains the previously computed exponent and string or is NULL. | ||
822 | |||
823 | return -1 if some field of number_parts is greater than INT_MAX */ | ||
824 | @@ -1559,7 +1559,7 @@ | ||
825 | /* fractional part */ | ||
826 | { | ||
827 | np->point = MPFR_DECIMAL_POINT; | ||
828 | - np->fp_trailing_zeros = (spec.spec == 'g' && spec.spec == 'G') ? | ||
829 | + np->fp_trailing_zeros = (spec.spec == 'g' || spec.spec == 'G') ? | ||
830 | spec.prec - 1 : spec.prec; | ||
831 | } | ||
832 | else if (spec.alt) | ||
833 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
834 | --- mpfr-3.1.2-a/src/version.c 2013-11-15 00:51:49.211333830 +0000 | ||
835 | +++ mpfr-3.1.2-b/src/version.c 2013-11-15 00:51:49.323334999 +0000 | ||
836 | @@ -25,5 +25,5 @@ | ||
837 | const char * | ||
838 | mpfr_get_version (void) | ||
839 | { | ||
840 | - return "3.1.2-p3"; | ||
841 | + return "3.1.2-p4"; | ||
842 | } | ||
843 | diff -Naurd mpfr-3.1.2-a/tests/tsprintf.c mpfr-3.1.2-b/tests/tsprintf.c | ||
844 | --- mpfr-3.1.2-a/tests/tsprintf.c 2013-03-13 15:37:44.000000000 +0000 | ||
845 | +++ mpfr-3.1.2-b/tests/tsprintf.c 2013-11-15 00:51:49.267334408 +0000 | ||
846 | @@ -456,10 +456,16 @@ | ||
847 | check_sprintf ("1.999900 ", "%-#10.7RG", x); | ||
848 | check_sprintf ("1.9999 ", "%-10.7RG", x); | ||
849 | mpfr_set_ui (x, 1, MPFR_RNDN); | ||
850 | + check_sprintf ("1.", "%#.1Rg", x); | ||
851 | + check_sprintf ("1. ", "%-#5.1Rg", x); | ||
852 | + check_sprintf (" 1.0", "%#5.2Rg", x); | ||
853 | check_sprintf ("1.00000000000000000000000000000", "%#.30Rg", x); | ||
854 | check_sprintf ("1", "%.30Rg", x); | ||
855 | mpfr_set_ui (x, 0, MPFR_RNDN); | ||
856 | - check_sprintf ("0.000000000000000000000000000000", "%#.30Rg", x); | ||
857 | + check_sprintf ("0.", "%#.1Rg", x); | ||
858 | + check_sprintf ("0. ", "%-#5.1Rg", x); | ||
859 | + check_sprintf (" 0.0", "%#5.2Rg", x); | ||
860 | + check_sprintf ("0.00000000000000000000000000000", "%#.30Rg", x); | ||
861 | check_sprintf ("0", "%.30Rg", x); | ||
862 | |||
863 | /* following tests with precision 53 bits */ | ||
864 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
865 | --- mpfr-3.1.2-a/PATCHES 2013-12-01 11:07:49.575329762 +0000 | ||
866 | +++ mpfr-3.1.2-b/PATCHES 2013-12-01 11:07:49.751331625 +0000 | ||
867 | @@ -0,0 +1 @@ | ||
868 | +custom_init_set | ||
869 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
870 | --- mpfr-3.1.2-a/VERSION 2013-12-01 11:07:49.571329714 +0000 | ||
871 | +++ mpfr-3.1.2-b/VERSION 2013-12-01 11:07:49.747331585 +0000 | ||
872 | @@ -1 +1 @@ | ||
873 | -3.1.2-p4 | ||
874 | +3.1.2-p5 | ||
875 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
876 | --- mpfr-3.1.2-a/src/mpfr.h 2013-12-01 11:07:49.571329714 +0000 | ||
877 | +++ mpfr-3.1.2-b/src/mpfr.h 2013-12-01 11:07:49.747331585 +0000 | ||
878 | @@ -27,7 +27,7 @@ | ||
879 | #define MPFR_VERSION_MAJOR 3 | ||
880 | #define MPFR_VERSION_MINOR 1 | ||
881 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
882 | -#define MPFR_VERSION_STRING "3.1.2-p4" | ||
883 | +#define MPFR_VERSION_STRING "3.1.2-p5" | ||
884 | |||
885 | /* Macros dealing with MPFR VERSION */ | ||
886 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
887 | @@ -861,7 +861,7 @@ | ||
888 | _t = (mpfr_kind_t) _k; \ | ||
889 | _s = 1; \ | ||
890 | } else { \ | ||
891 | - _t = (mpfr_kind_t) -k; \ | ||
892 | + _t = (mpfr_kind_t) - _k; \ | ||
893 | _s = -1; \ | ||
894 | } \ | ||
895 | _e = _t == MPFR_REGULAR_KIND ? (e) : \ | ||
896 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
897 | --- mpfr-3.1.2-a/src/version.c 2013-12-01 11:07:49.575329762 +0000 | ||
898 | +++ mpfr-3.1.2-b/src/version.c 2013-12-01 11:07:49.747331585 +0000 | ||
899 | @@ -25,5 +25,5 @@ | ||
900 | const char * | ||
901 | mpfr_get_version (void) | ||
902 | { | ||
903 | - return "3.1.2-p4"; | ||
904 | + return "3.1.2-p5"; | ||
905 | } | ||
906 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
907 | --- mpfr-3.1.2-a/PATCHES 2014-04-15 21:56:49.609057464 +0000 | ||
908 | +++ mpfr-3.1.2-b/PATCHES 2014-04-15 21:56:49.697059857 +0000 | ||
909 | @@ -0,0 +1 @@ | ||
910 | +li2-return | ||
911 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
912 | --- mpfr-3.1.2-a/VERSION 2014-04-15 21:56:49.609057464 +0000 | ||
913 | +++ mpfr-3.1.2-b/VERSION 2014-04-15 21:56:49.697059857 +0000 | ||
914 | @@ -1 +1 @@ | ||
915 | -3.1.2-p5 | ||
916 | +3.1.2-p6 | ||
917 | diff -Naurd mpfr-3.1.2-a/src/li2.c mpfr-3.1.2-b/src/li2.c | ||
918 | --- mpfr-3.1.2-a/src/li2.c 2013-03-13 15:37:32.000000000 +0000 | ||
919 | +++ mpfr-3.1.2-b/src/li2.c 2014-04-15 21:56:49.653058661 +0000 | ||
920 | @@ -630,5 +630,5 @@ | ||
921 | return mpfr_check_range (y, inexact, rnd_mode); | ||
922 | } | ||
923 | |||
924 | - MPFR_ASSERTN (0); /* should never reach this point */ | ||
925 | + MPFR_RET_NEVER_GO_HERE (); | ||
926 | } | ||
927 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
928 | --- mpfr-3.1.2-a/src/mpfr.h 2014-04-15 21:56:49.609057464 +0000 | ||
929 | +++ mpfr-3.1.2-b/src/mpfr.h 2014-04-15 21:56:49.697059857 +0000 | ||
930 | @@ -27,7 +27,7 @@ | ||
931 | #define MPFR_VERSION_MAJOR 3 | ||
932 | #define MPFR_VERSION_MINOR 1 | ||
933 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
934 | -#define MPFR_VERSION_STRING "3.1.2-p5" | ||
935 | +#define MPFR_VERSION_STRING "3.1.2-p6" | ||
936 | |||
937 | /* Macros dealing with MPFR VERSION */ | ||
938 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
939 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
940 | --- mpfr-3.1.2-a/src/version.c 2014-04-15 21:56:49.609057464 +0000 | ||
941 | +++ mpfr-3.1.2-b/src/version.c 2014-04-15 21:56:49.697059857 +0000 | ||
942 | @@ -25,5 +25,5 @@ | ||
943 | const char * | ||
944 | mpfr_get_version (void) | ||
945 | { | ||
946 | - return "3.1.2-p5"; | ||
947 | + return "3.1.2-p6"; | ||
948 | } | ||
949 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
950 | --- mpfr-3.1.2-a/PATCHES 2014-04-15 22:04:57.090286262 +0000 | ||
951 | +++ mpfr-3.1.2-b/PATCHES 2014-04-15 22:04:57.162288198 +0000 | ||
952 | @@ -0,0 +1 @@ | ||
953 | +exp3 | ||
954 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
955 | --- mpfr-3.1.2-a/VERSION 2014-04-15 22:04:57.086286154 +0000 | ||
956 | +++ mpfr-3.1.2-b/VERSION 2014-04-15 22:04:57.162288198 +0000 | ||
957 | @@ -1 +1 @@ | ||
958 | -3.1.2-p6 | ||
959 | +3.1.2-p7 | ||
960 | diff -Naurd mpfr-3.1.2-a/src/exp3.c mpfr-3.1.2-b/src/exp3.c | ||
961 | --- mpfr-3.1.2-a/src/exp3.c 2013-03-13 15:37:34.000000000 +0000 | ||
962 | +++ mpfr-3.1.2-b/src/exp3.c 2014-04-15 22:04:57.126287230 +0000 | ||
963 | @@ -283,7 +283,7 @@ | ||
964 | } | ||
965 | } | ||
966 | |||
967 | - if (mpfr_can_round (shift_x > 0 ? t : tmp, realprec, MPFR_RNDD, MPFR_RNDZ, | ||
968 | + if (mpfr_can_round (shift_x > 0 ? t : tmp, realprec, MPFR_RNDN, MPFR_RNDZ, | ||
969 | MPFR_PREC(y) + (rnd_mode == MPFR_RNDN))) | ||
970 | { | ||
971 | inexact = mpfr_set (y, shift_x > 0 ? t : tmp, rnd_mode); | ||
972 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
973 | --- mpfr-3.1.2-a/src/mpfr.h 2014-04-15 22:04:57.086286154 +0000 | ||
974 | +++ mpfr-3.1.2-b/src/mpfr.h 2014-04-15 22:04:57.162288198 +0000 | ||
975 | @@ -27,7 +27,7 @@ | ||
976 | #define MPFR_VERSION_MAJOR 3 | ||
977 | #define MPFR_VERSION_MINOR 1 | ||
978 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
979 | -#define MPFR_VERSION_STRING "3.1.2-p6" | ||
980 | +#define MPFR_VERSION_STRING "3.1.2-p7" | ||
981 | |||
982 | /* Macros dealing with MPFR VERSION */ | ||
983 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
984 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
985 | --- mpfr-3.1.2-a/src/version.c 2014-04-15 22:04:57.090286262 +0000 | ||
986 | +++ mpfr-3.1.2-b/src/version.c 2014-04-15 22:04:57.162288198 +0000 | ||
987 | @@ -25,5 +25,5 @@ | ||
988 | const char * | ||
989 | mpfr_get_version (void) | ||
990 | { | ||
991 | - return "3.1.2-p6"; | ||
992 | + return "3.1.2-p7"; | ||
993 | } | ||
994 | diff -Naurd mpfr-3.1.2-a/tests/texp.c mpfr-3.1.2-b/tests/texp.c | ||
995 | --- mpfr-3.1.2-a/tests/texp.c 2013-03-13 15:37:44.000000000 +0000 | ||
996 | +++ mpfr-3.1.2-b/tests/texp.c 2014-04-15 22:04:57.126287230 +0000 | ||
997 | @@ -150,6 +150,22 @@ | ||
998 | exit (1); | ||
999 | } | ||
1000 | |||
1001 | + mpfr_set_prec (x, 118); | ||
1002 | + mpfr_set_str_binary (x, "0.1110010100011101010000111110011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E-86"); | ||
1003 | + mpfr_set_prec (y, 118); | ||
1004 | + mpfr_exp_2 (y, x, MPFR_RNDU); | ||
1005 | + mpfr_exp_3 (x, x, MPFR_RNDU); | ||
1006 | + if (mpfr_cmp (x, y)) | ||
1007 | + { | ||
1008 | + printf ("mpfr_exp_2 and mpfr_exp_3 differ for prec=118\n"); | ||
1009 | + printf ("mpfr_exp_2 gives "); | ||
1010 | + mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN); | ||
1011 | + printf ("\nmpfr_exp_3 gives "); | ||
1012 | + mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); | ||
1013 | + printf ("\n"); | ||
1014 | + exit (1); | ||
1015 | + } | ||
1016 | + | ||
1017 | mpfr_clear (x); | ||
1018 | mpfr_clear (y); | ||
1019 | return 0; | ||
1020 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
1021 | --- mpfr-3.1.2-a/PATCHES 2014-04-15 22:20:32.243481506 +0000 | ||
1022 | +++ mpfr-3.1.2-b/PATCHES 2014-04-15 22:22:32.418722707 +0000 | ||
1023 | @@ -0,0 +1 @@ | ||
1024 | +gmp6-compat | ||
1025 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
1026 | --- mpfr-3.1.2-a/VERSION 2014-04-15 22:20:20.755171478 +0000 | ||
1027 | +++ mpfr-3.1.2-b/VERSION 2014-04-15 22:21:45.225450147 +0000 | ||
1028 | @@ -1 +1 @@ | ||
1029 | -3.1.2-p7 | ||
1030 | +3.1.2-p8 | ||
1031 | diff -Naurd mpfr-3.1.2-a/configure mpfr-3.1.2-b/configure | ||
1032 | --- mpfr-3.1.2-a/configure 2013-03-13 15:38:20.000000000 +0000 | ||
1033 | +++ mpfr-3.1.2-b/configure 2014-04-15 22:21:38.821277476 +0000 | ||
1034 | @@ -14545,26 +14545,30 @@ | ||
1035 | rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext | ||
1036 | fi | ||
1037 | |||
1038 | -if test "$use_gmp_build" = yes ; then | ||
1039 | - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for valid GMP_NUMB_BITS" >&5 | ||
1040 | -$as_echo_n "checking for valid GMP_NUMB_BITS... " >&6; } | ||
1041 | - if test "$cross_compiling" = yes; then : | ||
1042 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GMP_NUMB_BITS and sizeof(mp_limb_t) consistency" >&5 | ||
1043 | +$as_echo_n "checking for GMP_NUMB_BITS and sizeof(mp_limb_t) consistency... " >&6; } | ||
1044 | +if test "$cross_compiling" = yes; then : | ||
1045 | { $as_echo "$as_me:${as_lineno-$LINENO}: result: can't test" >&5 | ||
1046 | $as_echo "can't test" >&6; } | ||
1047 | else | ||
1048 | cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
1049 | /* end confdefs.h. */ | ||
1050 | |||
1051 | +#include <stdio.h> | ||
1052 | #include <limits.h> | ||
1053 | #include "gmp.h" | ||
1054 | -#include "gmp-impl.h" | ||
1055 | |||
1056 | int | ||
1057 | main () | ||
1058 | { | ||
1059 | |||
1060 | - return GMP_NUMB_BITS == BYTES_PER_MP_LIMB * CHAR_BIT | ||
1061 | - && sizeof(mp_limb_t) == BYTES_PER_MP_LIMB ? 0 : 1; | ||
1062 | + if (GMP_NUMB_BITS == sizeof(mp_limb_t) * CHAR_BIT) | ||
1063 | + return 0; | ||
1064 | + fprintf (stderr, "GMP_NUMB_BITS = %ld\n", (long) GMP_NUMB_BITS); | ||
1065 | + fprintf (stderr, "sizeof(mp_limb_t) = %ld\n", (long) sizeof(mp_limb_t)); | ||
1066 | + fprintf (stderr, "sizeof(mp_limb_t) * CHAR_BIT = %ld != GMP_NUMB_BITS\n", | ||
1067 | + (long) (sizeof(mp_limb_t) * CHAR_BIT)); | ||
1068 | + return 1; | ||
1069 | |||
1070 | ; | ||
1071 | return 0; | ||
1072 | @@ -14577,14 +14581,14 @@ | ||
1073 | |||
1074 | { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 | ||
1075 | $as_echo "no" >&6; } | ||
1076 | - as_fn_error $? "GMP_NUMB_BITS is incorrect. | ||
1077 | -You probably need to change some of the GMP or MPFR compile options." "$LINENO" 5 | ||
1078 | + as_fn_error $? "GMP_NUMB_BITS and sizeof(mp_limb_t) are not consistent. | ||
1079 | +You probably need to change some of the GMP or MPFR compile options. | ||
1080 | +See 'config.log' for details (search for GMP_NUMB_BITS)." "$LINENO" 5 | ||
1081 | fi | ||
1082 | rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ | ||
1083 | conftest.$ac_objext conftest.beam conftest.$ac_ext | ||
1084 | fi | ||
1085 | |||
1086 | -fi | ||
1087 | |||
1088 | |||
1089 | if test "$dont_link_with_gmp" = yes ; then | ||
1090 | diff -Naurd mpfr-3.1.2-a/configure.ac mpfr-3.1.2-b/configure.ac | ||
1091 | --- mpfr-3.1.2-a/configure.ac 2013-03-13 15:37:46.000000000 +0000 | ||
1092 | +++ mpfr-3.1.2-b/configure.ac 2013-03-13 15:37:46.000000000 +0000 | ||
1093 | @@ -435,23 +435,29 @@ | ||
1094 | ]) | ||
1095 | fi | ||
1096 | |||
1097 | -dnl Check for valid GMP_NUMB_BITS and BYTES_PER_MP_LIMB | ||
1098 | +dnl Check for GMP_NUMB_BITS and sizeof(mp_limb_t) consistency. | ||
1099 | +dnl Problems may occur if gmp.h was generated with some ABI | ||
1100 | +dnl and is used with another ABI (or if nails are used). | ||
1101 | dnl This test doesn't need to link with libgmp (at least it shouldn't). | ||
1102 | -if test "$use_gmp_build" = yes ; then | ||
1103 | - AC_MSG_CHECKING(for valid GMP_NUMB_BITS) | ||
1104 | - AC_RUN_IFELSE([AC_LANG_PROGRAM([[ | ||
1105 | +AC_MSG_CHECKING(for GMP_NUMB_BITS and sizeof(mp_limb_t) consistency) | ||
1106 | +AC_RUN_IFELSE([AC_LANG_PROGRAM([[ | ||
1107 | +#include <stdio.h> | ||
1108 | #include <limits.h> | ||
1109 | #include "gmp.h" | ||
1110 | -#include "gmp-impl.h" | ||
1111 | ]], [[ | ||
1112 | - return GMP_NUMB_BITS == BYTES_PER_MP_LIMB * CHAR_BIT | ||
1113 | - && sizeof(mp_limb_t) == BYTES_PER_MP_LIMB ? 0 : 1; | ||
1114 | + if (GMP_NUMB_BITS == sizeof(mp_limb_t) * CHAR_BIT) | ||
1115 | + return 0; | ||
1116 | + fprintf (stderr, "GMP_NUMB_BITS = %ld\n", (long) GMP_NUMB_BITS); | ||
1117 | + fprintf (stderr, "sizeof(mp_limb_t) = %ld\n", (long) sizeof(mp_limb_t)); | ||
1118 | + fprintf (stderr, "sizeof(mp_limb_t) * CHAR_BIT = %ld != GMP_NUMB_BITS\n", | ||
1119 | + (long) (sizeof(mp_limb_t) * CHAR_BIT)); | ||
1120 | + return 1; | ||
1121 | ]])], [AC_MSG_RESULT(yes)], [ | ||
1122 | AC_MSG_RESULT(no) | ||
1123 | - AC_MSG_ERROR([GMP_NUMB_BITS is incorrect. | ||
1124 | -You probably need to change some of the GMP or MPFR compile options.])], | ||
1125 | + AC_MSG_ERROR([GMP_NUMB_BITS and sizeof(mp_limb_t) are not consistent. | ||
1126 | +You probably need to change some of the GMP or MPFR compile options. | ||
1127 | +See 'config.log' for details (search for GMP_NUMB_BITS).])], | ||
1128 | [AC_MSG_RESULT([can't test])]) | ||
1129 | -fi | ||
1130 | |||
1131 | |||
1132 | dnl We really need to link using libtool. But it is impossible with the current | ||
1133 | diff -Naurd mpfr-3.1.2-a/src/init2.c mpfr-3.1.2-b/src/init2.c | ||
1134 | --- mpfr-3.1.2-a/src/init2.c 2013-03-13 15:37:32.000000000 +0000 | ||
1135 | +++ mpfr-3.1.2-b/src/init2.c 2014-04-15 22:21:06.220398489 +0000 | ||
1136 | @@ -30,11 +30,11 @@ | ||
1137 | |||
1138 | /* Check if we can represent the number of limbs | ||
1139 | * associated to the maximum of mpfr_prec_t*/ | ||
1140 | - MPFR_ASSERTN( MP_SIZE_T_MAX >= (MPFR_PREC_MAX/BYTES_PER_MP_LIMB) ); | ||
1141 | + MPFR_ASSERTN( MP_SIZE_T_MAX >= (MPFR_PREC_MAX/MPFR_BYTES_PER_MP_LIMB) ); | ||
1142 | |||
1143 | - /* Check for correct GMP_NUMB_BITS and BYTES_PER_MP_LIMB */ | ||
1144 | - MPFR_ASSERTN( GMP_NUMB_BITS == BYTES_PER_MP_LIMB * CHAR_BIT | ||
1145 | - && sizeof(mp_limb_t) == BYTES_PER_MP_LIMB ); | ||
1146 | + /* Check for correct GMP_NUMB_BITS and MPFR_BYTES_PER_MP_LIMB */ | ||
1147 | + MPFR_ASSERTN( GMP_NUMB_BITS == MPFR_BYTES_PER_MP_LIMB * CHAR_BIT | ||
1148 | + && sizeof(mp_limb_t) == MPFR_BYTES_PER_MP_LIMB ); | ||
1149 | |||
1150 | MPFR_ASSERTN (mp_bits_per_limb == GMP_NUMB_BITS); | ||
1151 | |||
1152 | diff -Naurd mpfr-3.1.2-a/src/mpfr-gmp.h mpfr-3.1.2-b/src/mpfr-gmp.h | ||
1153 | --- mpfr-3.1.2-a/src/mpfr-gmp.h 2013-03-13 15:37:32.000000000 +0000 | ||
1154 | +++ mpfr-3.1.2-b/src/mpfr-gmp.h 2014-04-15 22:21:06.220398489 +0000 | ||
1155 | @@ -72,7 +72,6 @@ | ||
1156 | #endif | ||
1157 | |||
1158 | /* Define some macros */ | ||
1159 | -#define BYTES_PER_MP_LIMB (GMP_NUMB_BITS/CHAR_BIT) | ||
1160 | |||
1161 | #define MP_LIMB_T_MAX (~(mp_limb_t)0) | ||
1162 | |||
1163 | @@ -96,19 +95,19 @@ | ||
1164 | #define SHRT_HIGHBIT SHRT_MIN | ||
1165 | |||
1166 | /* MP_LIMB macros */ | ||
1167 | -#define MPN_ZERO(dst, n) memset((dst), 0, (n)*BYTES_PER_MP_LIMB) | ||
1168 | -#define MPN_COPY_DECR(dst,src,n) memmove((dst),(src),(n)*BYTES_PER_MP_LIMB) | ||
1169 | -#define MPN_COPY_INCR(dst,src,n) memmove((dst),(src),(n)*BYTES_PER_MP_LIMB) | ||
1170 | +#define MPN_ZERO(dst, n) memset((dst), 0, (n)*MPFR_BYTES_PER_MP_LIMB) | ||
1171 | +#define MPN_COPY_DECR(dst,src,n) memmove((dst),(src),(n)*MPFR_BYTES_PER_MP_LIMB) | ||
1172 | +#define MPN_COPY_INCR(dst,src,n) memmove((dst),(src),(n)*MPFR_BYTES_PER_MP_LIMB) | ||
1173 | #define MPN_COPY(dst,src,n) \ | ||
1174 | do \ | ||
1175 | { \ | ||
1176 | if ((dst) != (src)) \ | ||
1177 | { \ | ||
1178 | MPFR_ASSERTD ((char *) (dst) >= (char *) (src) + \ | ||
1179 | - (n) * BYTES_PER_MP_LIMB || \ | ||
1180 | + (n) * MPFR_BYTES_PER_MP_LIMB || \ | ||
1181 | (char *) (src) >= (char *) (dst) + \ | ||
1182 | - (n) * BYTES_PER_MP_LIMB); \ | ||
1183 | - memcpy ((dst), (src), (n) * BYTES_PER_MP_LIMB); \ | ||
1184 | + (n) * MPFR_BYTES_PER_MP_LIMB); \ | ||
1185 | + memcpy ((dst), (src), (n) * MPFR_BYTES_PER_MP_LIMB); \ | ||
1186 | } \ | ||
1187 | } \ | ||
1188 | while (0) | ||
1189 | diff -Naurd mpfr-3.1.2-a/src/mpfr-impl.h mpfr-3.1.2-b/src/mpfr-impl.h | ||
1190 | --- mpfr-3.1.2-a/src/mpfr-impl.h 2013-10-09 13:34:21.000000000 +0000 | ||
1191 | +++ mpfr-3.1.2-b/src/mpfr-impl.h 2014-04-15 22:21:06.220398489 +0000 | ||
1192 | @@ -191,7 +191,7 @@ | ||
1193 | # endif | ||
1194 | #endif | ||
1195 | |||
1196 | - | ||
1197 | +#define MPFR_BYTES_PER_MP_LIMB (GMP_NUMB_BITS/CHAR_BIT) | ||
1198 | |||
1199 | /****************************************************** | ||
1200 | ******************** Check GMP *********************** | ||
1201 | @@ -930,7 +930,7 @@ | ||
1202 | #define MPFR_SET_ALLOC_SIZE(x, n) \ | ||
1203 | ( ((mp_size_t*) MPFR_MANT(x))[-1] = n) | ||
1204 | #define MPFR_MALLOC_SIZE(s) \ | ||
1205 | - ( sizeof(mpfr_size_limb_t) + BYTES_PER_MP_LIMB * ((size_t) s) ) | ||
1206 | + ( sizeof(mpfr_size_limb_t) + MPFR_BYTES_PER_MP_LIMB * ((size_t) s) ) | ||
1207 | #define MPFR_SET_MANT_PTR(x,p) \ | ||
1208 | (MPFR_MANT(x) = (mp_limb_t*) ((mpfr_size_limb_t*) p + 1)) | ||
1209 | #define MPFR_GET_REAL_PTR(x) \ | ||
1210 | @@ -964,7 +964,7 @@ | ||
1211 | #endif | ||
1212 | |||
1213 | #define MPFR_TMP_LIMBS_ALLOC(N) \ | ||
1214 | - ((mp_limb_t *) MPFR_TMP_ALLOC ((size_t) (N) * BYTES_PER_MP_LIMB)) | ||
1215 | + ((mp_limb_t *) MPFR_TMP_ALLOC ((size_t) (N) * MPFR_BYTES_PER_MP_LIMB)) | ||
1216 | |||
1217 | /* temporary allocate 1 limb at xp, and initialize mpfr variable x */ | ||
1218 | /* The temporary var doesn't have any size field, but it doesn't matter | ||
1219 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
1220 | --- mpfr-3.1.2-a/src/mpfr.h 2014-04-15 22:20:20.755171478 +0000 | ||
1221 | +++ mpfr-3.1.2-b/src/mpfr.h 2014-04-15 22:21:45.225450147 +0000 | ||
1222 | @@ -27,7 +27,7 @@ | ||
1223 | #define MPFR_VERSION_MAJOR 3 | ||
1224 | #define MPFR_VERSION_MINOR 1 | ||
1225 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
1226 | -#define MPFR_VERSION_STRING "3.1.2-p7" | ||
1227 | +#define MPFR_VERSION_STRING "3.1.2-p8" | ||
1228 | |||
1229 | /* Macros dealing with MPFR VERSION */ | ||
1230 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
1231 | diff -Naurd mpfr-3.1.2-a/src/mul.c mpfr-3.1.2-b/src/mul.c | ||
1232 | --- mpfr-3.1.2-a/src/mul.c 2013-03-13 15:37:37.000000000 +0000 | ||
1233 | +++ mpfr-3.1.2-b/src/mul.c 2014-04-15 22:21:06.224398597 +0000 | ||
1234 | @@ -106,7 +106,7 @@ | ||
1235 | MPFR_ASSERTD(tn <= k); | ||
1236 | |||
1237 | /* Check for no size_t overflow*/ | ||
1238 | - MPFR_ASSERTD((size_t) k <= ((size_t) -1) / BYTES_PER_MP_LIMB); | ||
1239 | + MPFR_ASSERTD((size_t) k <= ((size_t) -1) / MPFR_BYTES_PER_MP_LIMB); | ||
1240 | MPFR_TMP_MARK(marker); | ||
1241 | tmp = MPFR_TMP_LIMBS_ALLOC (k); | ||
1242 | |||
1243 | @@ -301,7 +301,7 @@ | ||
1244 | MPFR_ASSERTD (tn <= k); /* tn <= k, thus no int overflow */ | ||
1245 | |||
1246 | /* Check for no size_t overflow*/ | ||
1247 | - MPFR_ASSERTD ((size_t) k <= ((size_t) -1) / BYTES_PER_MP_LIMB); | ||
1248 | + MPFR_ASSERTD ((size_t) k <= ((size_t) -1) / MPFR_BYTES_PER_MP_LIMB); | ||
1249 | MPFR_TMP_MARK (marker); | ||
1250 | tmp = MPFR_TMP_LIMBS_ALLOC (k); | ||
1251 | |||
1252 | diff -Naurd mpfr-3.1.2-a/src/stack_interface.c mpfr-3.1.2-b/src/stack_interface.c | ||
1253 | --- mpfr-3.1.2-a/src/stack_interface.c 2013-03-13 15:37:32.000000000 +0000 | ||
1254 | +++ mpfr-3.1.2-b/src/stack_interface.c 2014-04-15 22:21:06.220398489 +0000 | ||
1255 | @@ -26,7 +26,7 @@ | ||
1256 | size_t | ||
1257 | mpfr_custom_get_size (mpfr_prec_t prec) | ||
1258 | { | ||
1259 | - return MPFR_PREC2LIMBS (prec) * BYTES_PER_MP_LIMB; | ||
1260 | + return MPFR_PREC2LIMBS (prec) * MPFR_BYTES_PER_MP_LIMB; | ||
1261 | } | ||
1262 | |||
1263 | #undef mpfr_custom_init | ||
1264 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
1265 | --- mpfr-3.1.2-a/src/version.c 2014-04-15 22:20:20.755171478 +0000 | ||
1266 | +++ mpfr-3.1.2-b/src/version.c 2014-04-15 22:21:45.225450147 +0000 | ||
1267 | @@ -25,5 +25,5 @@ | ||
1268 | const char * | ||
1269 | mpfr_get_version (void) | ||
1270 | { | ||
1271 | - return "3.1.2-p7"; | ||
1272 | + return "3.1.2-p8"; | ||
1273 | } | ||
1274 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
1275 | --- mpfr-3.1.2-a/PATCHES 2014-06-30 15:15:25.533266905 +0000 | ||
1276 | +++ mpfr-3.1.2-b/PATCHES 2014-06-30 15:15:25.617269178 +0000 | ||
1277 | @@ -0,0 +1 @@ | ||
1278 | +div-overflow | ||
1279 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
1280 | --- mpfr-3.1.2-a/VERSION 2014-06-30 15:15:25.529266797 +0000 | ||
1281 | +++ mpfr-3.1.2-b/VERSION 2014-06-30 15:15:25.617269178 +0000 | ||
1282 | @@ -1 +1 @@ | ||
1283 | -3.1.2-p8 | ||
1284 | +3.1.2-p9 | ||
1285 | diff -Naurd mpfr-3.1.2-a/src/div.c mpfr-3.1.2-b/src/div.c | ||
1286 | --- mpfr-3.1.2-a/src/div.c 2013-03-13 15:37:33.000000000 +0000 | ||
1287 | +++ mpfr-3.1.2-b/src/div.c 2014-06-30 15:15:25.585268312 +0000 | ||
1288 | @@ -750,7 +750,9 @@ | ||
1289 | truncate_check_qh: | ||
1290 | if (qh) | ||
1291 | { | ||
1292 | - qexp ++; | ||
1293 | + if (MPFR_LIKELY (qexp < MPFR_EXP_MAX)) | ||
1294 | + qexp ++; | ||
1295 | + /* else qexp is now incorrect, but one will still get an overflow */ | ||
1296 | q0p[q0size - 1] = MPFR_LIMB_HIGHBIT; | ||
1297 | } | ||
1298 | goto truncate; | ||
1299 | @@ -765,7 +767,9 @@ | ||
1300 | inex = 1; /* always here */ | ||
1301 | if (mpn_add_1 (q0p, q0p, q0size, MPFR_LIMB_ONE << sh)) | ||
1302 | { | ||
1303 | - qexp ++; | ||
1304 | + if (MPFR_LIKELY (qexp < MPFR_EXP_MAX)) | ||
1305 | + qexp ++; | ||
1306 | + /* else qexp is now incorrect, but one will still get an overflow */ | ||
1307 | q0p[q0size - 1] = MPFR_LIMB_HIGHBIT; | ||
1308 | } | ||
1309 | |||
1310 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
1311 | --- mpfr-3.1.2-a/src/mpfr.h 2014-06-30 15:15:25.533266905 +0000 | ||
1312 | +++ mpfr-3.1.2-b/src/mpfr.h 2014-06-30 15:15:25.613269070 +0000 | ||
1313 | @@ -27,7 +27,7 @@ | ||
1314 | #define MPFR_VERSION_MAJOR 3 | ||
1315 | #define MPFR_VERSION_MINOR 1 | ||
1316 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
1317 | -#define MPFR_VERSION_STRING "3.1.2-p8" | ||
1318 | +#define MPFR_VERSION_STRING "3.1.2-p9" | ||
1319 | |||
1320 | /* Macros dealing with MPFR VERSION */ | ||
1321 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
1322 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
1323 | --- mpfr-3.1.2-a/src/version.c 2014-06-30 15:15:25.533266905 +0000 | ||
1324 | +++ mpfr-3.1.2-b/src/version.c 2014-06-30 15:15:25.613269070 +0000 | ||
1325 | @@ -25,5 +25,5 @@ | ||
1326 | const char * | ||
1327 | mpfr_get_version (void) | ||
1328 | { | ||
1329 | - return "3.1.2-p8"; | ||
1330 | + return "3.1.2-p9"; | ||
1331 | } | ||
1332 | diff -Naurd mpfr-3.1.2-a/tests/tdiv.c mpfr-3.1.2-b/tests/tdiv.c | ||
1333 | --- mpfr-3.1.2-a/tests/tdiv.c 2013-03-13 15:37:44.000000000 +0000 | ||
1334 | +++ mpfr-3.1.2-b/tests/tdiv.c 2014-06-30 15:15:25.585268312 +0000 | ||
1335 | @@ -1104,6 +1104,96 @@ | ||
1336 | #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS) | ||
1337 | #include "tgeneric.c" | ||
1338 | |||
1339 | +static void | ||
1340 | +test_extreme (void) | ||
1341 | +{ | ||
1342 | + mpfr_t x, y, z; | ||
1343 | + mpfr_exp_t emin, emax; | ||
1344 | + mpfr_prec_t p[4] = { 8, 32, 64, 256 }; | ||
1345 | + int xi, yi, zi, j, r; | ||
1346 | + unsigned int flags, ex_flags; | ||
1347 | + | ||
1348 | + emin = mpfr_get_emin (); | ||
1349 | + emax = mpfr_get_emax (); | ||
1350 | + | ||
1351 | + mpfr_set_emin (MPFR_EMIN_MIN); | ||
1352 | + mpfr_set_emax (MPFR_EMAX_MAX); | ||
1353 | + | ||
1354 | + for (xi = 0; xi < 4; xi++) | ||
1355 | + { | ||
1356 | + mpfr_init2 (x, p[xi]); | ||
1357 | + mpfr_setmax (x, MPFR_EMAX_MAX); | ||
1358 | + MPFR_ASSERTN (mpfr_check (x)); | ||
1359 | + for (yi = 0; yi < 4; yi++) | ||
1360 | + { | ||
1361 | + mpfr_init2 (y, p[yi]); | ||
1362 | + mpfr_setmin (y, MPFR_EMIN_MIN); | ||
1363 | + for (j = 0; j < 2; j++) | ||
1364 | + { | ||
1365 | + MPFR_ASSERTN (mpfr_check (y)); | ||
1366 | + for (zi = 0; zi < 4; zi++) | ||
1367 | + { | ||
1368 | + mpfr_init2 (z, p[zi]); | ||
1369 | + RND_LOOP (r) | ||
1370 | + { | ||
1371 | + mpfr_clear_flags (); | ||
1372 | + mpfr_div (z, x, y, (mpfr_rnd_t) r); | ||
1373 | + flags = __gmpfr_flags; | ||
1374 | + MPFR_ASSERTN (mpfr_check (z)); | ||
1375 | + ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT; | ||
1376 | + if (flags != ex_flags) | ||
1377 | + { | ||
1378 | + printf ("Bad flags in test_extreme on z = a/b" | ||
1379 | + " with %s and\n", | ||
1380 | + mpfr_print_rnd_mode ((mpfr_rnd_t) r)); | ||
1381 | + printf ("a = "); | ||
1382 | + mpfr_dump (x); | ||
1383 | + printf ("b = "); | ||
1384 | + mpfr_dump (y); | ||
1385 | + printf ("Expected flags:"); | ||
1386 | + flags_out (ex_flags); | ||
1387 | + printf ("Got flags: "); | ||
1388 | + flags_out (flags); | ||
1389 | + printf ("z = "); | ||
1390 | + mpfr_dump (z); | ||
1391 | + exit (1); | ||
1392 | + } | ||
1393 | + mpfr_clear_flags (); | ||
1394 | + mpfr_div (z, y, x, (mpfr_rnd_t) r); | ||
1395 | + flags = __gmpfr_flags; | ||
1396 | + MPFR_ASSERTN (mpfr_check (z)); | ||
1397 | + ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT; | ||
1398 | + if (flags != ex_flags) | ||
1399 | + { | ||
1400 | + printf ("Bad flags in test_extreme on z = a/b" | ||
1401 | + " with %s and\n", | ||
1402 | + mpfr_print_rnd_mode ((mpfr_rnd_t) r)); | ||
1403 | + printf ("a = "); | ||
1404 | + mpfr_dump (y); | ||
1405 | + printf ("b = "); | ||
1406 | + mpfr_dump (x); | ||
1407 | + printf ("Expected flags:"); | ||
1408 | + flags_out (ex_flags); | ||
1409 | + printf ("Got flags: "); | ||
1410 | + flags_out (flags); | ||
1411 | + printf ("z = "); | ||
1412 | + mpfr_dump (z); | ||
1413 | + exit (1); | ||
1414 | + } | ||
1415 | + } | ||
1416 | + mpfr_clear (z); | ||
1417 | + } /* zi */ | ||
1418 | + mpfr_nextabove (y); | ||
1419 | + } /* j */ | ||
1420 | + mpfr_clear (y); | ||
1421 | + } /* yi */ | ||
1422 | + mpfr_clear (x); | ||
1423 | + } /* xi */ | ||
1424 | + | ||
1425 | + set_emin (emin); | ||
1426 | + set_emax (emax); | ||
1427 | +} | ||
1428 | + | ||
1429 | int | ||
1430 | main (int argc, char *argv[]) | ||
1431 | { | ||
1432 | @@ -1130,6 +1220,7 @@ | ||
1433 | test_20070603 (); | ||
1434 | test_20070628 (); | ||
1435 | test_generic (2, 800, 50); | ||
1436 | + test_extreme (); | ||
1437 | |||
1438 | tests_end_mpfr (); | ||
1439 | return 0; | ||
1440 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
1441 | --- mpfr-3.1.2-a/PATCHES 2014-06-30 15:17:53.337268149 +0000 | ||
1442 | +++ mpfr-3.1.2-b/PATCHES 2014-06-30 15:17:53.417270314 +0000 | ||
1443 | @@ -0,0 +1 @@ | ||
1444 | +vasprintf | ||
1445 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
1446 | --- mpfr-3.1.2-a/VERSION 2014-06-30 15:17:53.337268149 +0000 | ||
1447 | +++ mpfr-3.1.2-b/VERSION 2014-06-30 15:17:53.413270206 +0000 | ||
1448 | @@ -1 +1 @@ | ||
1449 | -3.1.2-p9 | ||
1450 | +3.1.2-p10 | ||
1451 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
1452 | --- mpfr-3.1.2-a/src/mpfr.h 2014-06-30 15:17:53.337268149 +0000 | ||
1453 | +++ mpfr-3.1.2-b/src/mpfr.h 2014-06-30 15:17:53.413270206 +0000 | ||
1454 | @@ -27,7 +27,7 @@ | ||
1455 | #define MPFR_VERSION_MAJOR 3 | ||
1456 | #define MPFR_VERSION_MINOR 1 | ||
1457 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
1458 | -#define MPFR_VERSION_STRING "3.1.2-p9" | ||
1459 | +#define MPFR_VERSION_STRING "3.1.2-p10" | ||
1460 | |||
1461 | /* Macros dealing with MPFR VERSION */ | ||
1462 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
1463 | diff -Naurd mpfr-3.1.2-a/src/vasprintf.c mpfr-3.1.2-b/src/vasprintf.c | ||
1464 | --- mpfr-3.1.2-a/src/vasprintf.c 2013-11-15 00:51:49.267334408 +0000 | ||
1465 | +++ mpfr-3.1.2-b/src/vasprintf.c 2014-06-30 15:17:53.377269231 +0000 | ||
1466 | @@ -884,14 +884,18 @@ | ||
1467 | first digit, we want the exponent for radix two and the decimal | ||
1468 | point AFTER the first digit. */ | ||
1469 | { | ||
1470 | - MPFR_ASSERTN (exp > MPFR_EMIN_MIN /4); /* possible overflow */ | ||
1471 | + /* An integer overflow is normally not possible since MPFR_EXP_MIN | ||
1472 | + is twice as large as MPFR_EMIN_MIN. */ | ||
1473 | + MPFR_ASSERTN (exp > (MPFR_EXP_MIN + 3) / 4); | ||
1474 | exp = (exp - 1) * 4; | ||
1475 | } | ||
1476 | else | ||
1477 | /* EXP is the exponent for decimal point BEFORE the first digit, we | ||
1478 | want the exponent for decimal point AFTER the first digit. */ | ||
1479 | { | ||
1480 | - MPFR_ASSERTN (exp > MPFR_EMIN_MIN); /* possible overflow */ | ||
1481 | + /* An integer overflow is normally not possible since MPFR_EXP_MIN | ||
1482 | + is twice as large as MPFR_EMIN_MIN. */ | ||
1483 | + MPFR_ASSERTN (exp > MPFR_EXP_MIN); | ||
1484 | --exp; | ||
1485 | } | ||
1486 | } | ||
1487 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
1488 | --- mpfr-3.1.2-a/src/version.c 2014-06-30 15:17:53.337268149 +0000 | ||
1489 | +++ mpfr-3.1.2-b/src/version.c 2014-06-30 15:17:53.413270206 +0000 | ||
1490 | @@ -25,5 +25,5 @@ | ||
1491 | const char * | ||
1492 | mpfr_get_version (void) | ||
1493 | { | ||
1494 | - return "3.1.2-p9"; | ||
1495 | + return "3.1.2-p10"; | ||
1496 | } | ||
1497 | diff -Naurd mpfr-3.1.2-a/tests/tsprintf.c mpfr-3.1.2-b/tests/tsprintf.c | ||
1498 | --- mpfr-3.1.2-a/tests/tsprintf.c 2013-11-15 00:51:49.267334408 +0000 | ||
1499 | +++ mpfr-3.1.2-b/tests/tsprintf.c 2014-06-30 15:17:53.377269231 +0000 | ||
1500 | @@ -1184,6 +1184,69 @@ | ||
1501 | check_emax_aux (MPFR_EMAX_MAX); | ||
1502 | } | ||
1503 | |||
1504 | +static void | ||
1505 | +check_emin_aux (mpfr_exp_t e) | ||
1506 | +{ | ||
1507 | + mpfr_t x; | ||
1508 | + char *s1, s2[256]; | ||
1509 | + int i; | ||
1510 | + mpfr_exp_t emin; | ||
1511 | + mpz_t ee; | ||
1512 | + | ||
1513 | + MPFR_ASSERTN (e >= LONG_MIN); | ||
1514 | + emin = mpfr_get_emin (); | ||
1515 | + set_emin (e); | ||
1516 | + | ||
1517 | + mpfr_init2 (x, 16); | ||
1518 | + mpz_init (ee); | ||
1519 | + | ||
1520 | + mpfr_setmin (x, e); | ||
1521 | + mpz_set_si (ee, e); | ||
1522 | + mpz_sub_ui (ee, ee, 1); | ||
1523 | + | ||
1524 | + i = mpfr_asprintf (&s1, "%Ra", x); | ||
1525 | + MPFR_ASSERTN (i > 0); | ||
1526 | + | ||
1527 | + gmp_snprintf (s2, 256, "0x1p%Zd", ee); | ||
1528 | + | ||
1529 | + if (strcmp (s1, s2) != 0) | ||
1530 | + { | ||
1531 | + printf ("Error in check_emin_aux for emin = %ld\n", (long) e); | ||
1532 | + printf ("Expected %s\n", s2); | ||
1533 | + printf ("Got %s\n", s1); | ||
1534 | + exit (1); | ||
1535 | + } | ||
1536 | + | ||
1537 | + mpfr_free_str (s1); | ||
1538 | + | ||
1539 | + i = mpfr_asprintf (&s1, "%Rb", x); | ||
1540 | + MPFR_ASSERTN (i > 0); | ||
1541 | + | ||
1542 | + gmp_snprintf (s2, 256, "1p%Zd", ee); | ||
1543 | + | ||
1544 | + if (strcmp (s1, s2) != 0) | ||
1545 | + { | ||
1546 | + printf ("Error in check_emin_aux for emin = %ld\n", (long) e); | ||
1547 | + printf ("Expected %s\n", s2); | ||
1548 | + printf ("Got %s\n", s1); | ||
1549 | + exit (1); | ||
1550 | + } | ||
1551 | + | ||
1552 | + mpfr_free_str (s1); | ||
1553 | + | ||
1554 | + mpfr_clear (x); | ||
1555 | + mpz_clear (ee); | ||
1556 | + set_emin (emin); | ||
1557 | +} | ||
1558 | + | ||
1559 | +static void | ||
1560 | +check_emin (void) | ||
1561 | +{ | ||
1562 | + check_emin_aux (-15); | ||
1563 | + check_emin_aux (mpfr_get_emin ()); | ||
1564 | + check_emin_aux (MPFR_EMIN_MIN); | ||
1565 | +} | ||
1566 | + | ||
1567 | int | ||
1568 | main (int argc, char **argv) | ||
1569 | { | ||
1570 | @@ -1203,6 +1266,7 @@ | ||
1571 | decimal (); | ||
1572 | mixed (); | ||
1573 | check_emax (); | ||
1574 | + check_emin (); | ||
1575 | |||
1576 | #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE) | ||
1577 | locale_da_DK (); | ||
1578 | diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES | ||
1579 | --- mpfr-3.1.2-a/PATCHES 2014-12-04 01:41:57.131789485 +0000 | ||
1580 | +++ mpfr-3.1.2-b/PATCHES 2014-12-04 01:41:57.339791833 +0000 | ||
1581 | @@ -0,0 +1 @@ | ||
1582 | +strtofr | ||
1583 | diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION | ||
1584 | --- mpfr-3.1.2-a/VERSION 2014-12-04 01:41:57.127789443 +0000 | ||
1585 | +++ mpfr-3.1.2-b/VERSION 2014-12-04 01:41:57.339791833 +0000 | ||
1586 | @@ -1 +1 @@ | ||
1587 | -3.1.2-p10 | ||
1588 | +3.1.2-p11 | ||
1589 | diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h | ||
1590 | --- mpfr-3.1.2-a/src/mpfr.h 2014-12-04 01:41:57.127789443 +0000 | ||
1591 | +++ mpfr-3.1.2-b/src/mpfr.h 2014-12-04 01:41:57.335791790 +0000 | ||
1592 | @@ -27,7 +27,7 @@ | ||
1593 | #define MPFR_VERSION_MAJOR 3 | ||
1594 | #define MPFR_VERSION_MINOR 1 | ||
1595 | #define MPFR_VERSION_PATCHLEVEL 2 | ||
1596 | -#define MPFR_VERSION_STRING "3.1.2-p10" | ||
1597 | +#define MPFR_VERSION_STRING "3.1.2-p11" | ||
1598 | |||
1599 | /* Macros dealing with MPFR VERSION */ | ||
1600 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) | ||
1601 | diff -Naurd mpfr-3.1.2-a/src/strtofr.c mpfr-3.1.2-b/src/strtofr.c | ||
1602 | --- mpfr-3.1.2-a/src/strtofr.c 2013-03-13 15:37:32.000000000 +0000 | ||
1603 | +++ mpfr-3.1.2-b/src/strtofr.c 2014-12-04 01:41:57.287791246 +0000 | ||
1604 | @@ -473,8 +473,10 @@ | ||
1605 | /* prec bits corresponds to ysize limbs */ | ||
1606 | ysize_bits = ysize * GMP_NUMB_BITS; | ||
1607 | /* and to ysize_bits >= prec > MPFR_PREC (x) bits */ | ||
1608 | - y = MPFR_TMP_LIMBS_ALLOC (2 * ysize + 1); | ||
1609 | - y += ysize; /* y has (ysize+1) allocated limbs */ | ||
1610 | + /* we need to allocate one more limb to work around bug | ||
1611 | + https://gmplib.org/list-archives/gmp-bugs/2013-December/003267.html */ | ||
1612 | + y = MPFR_TMP_LIMBS_ALLOC (2 * ysize + 2); | ||
1613 | + y += ysize; /* y has (ysize+2) allocated limbs */ | ||
1614 | |||
1615 | /* pstr_size is the number of characters we read in pstr->mant | ||
1616 | to have at least ysize full limbs. | ||
1617 | diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c | ||
1618 | --- mpfr-3.1.2-a/src/version.c 2014-12-04 01:41:57.131789485 +0000 | ||
1619 | +++ mpfr-3.1.2-b/src/version.c 2014-12-04 01:41:57.339791833 +0000 | ||
1620 | @@ -25,5 +25,5 @@ | ||
1621 | const char * | ||
1622 | mpfr_get_version (void) | ||
1623 | { | ||
1624 | - return "3.1.2-p10"; | ||
1625 | + return "3.1.2-p11"; | ||
1626 | } |