Contents of /trunk/mpfr/patches/mpfr-3.1.2-p11.patch
Parent Directory | Revision Log
Revision 2570 -
(show 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 | 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 | } |