[79bc757] | 1 | Submitted By: William Harrington (kb0iic at cross-lfs dot org) |
---|
| 2 | Date: 2017-05-10 |
---|
| 3 | Initial Package Version: 3.1.5 |
---|
| 4 | Origin: Upstream |
---|
| 5 | Upstream Status: Applied |
---|
| 6 | Description: Contains all upstream patches of mpfr current to patch level 2. |
---|
| 7 | |
---|
| 8 | diff -Naur mpfr-3.1.5.orig/PATCHES mpfr-3.1.5/PATCHES |
---|
| 9 | --- mpfr-3.1.5.orig/PATCHES 2016-09-27 07:58:15.000000000 +0000 |
---|
| 10 | +++ mpfr-3.1.5/PATCHES 2017-05-10 23:18:31.760630521 +0000 |
---|
| 11 | @@ -0,0 +1,2 @@ |
---|
| 12 | +strtofr |
---|
| 13 | +vasprintf |
---|
| 14 | diff -Naur mpfr-3.1.5.orig/VERSION mpfr-3.1.5/VERSION |
---|
| 15 | --- mpfr-3.1.5.orig/VERSION 2016-09-27 07:58:14.000000000 +0000 |
---|
| 16 | +++ mpfr-3.1.5/VERSION 2017-05-10 23:18:31.767631412 +0000 |
---|
| 17 | @@ -1 +1 @@ |
---|
| 18 | -3.1.5 |
---|
| 19 | +3.1.5-p2 |
---|
| 20 | diff -Naur mpfr-3.1.5.orig/src/mpfr.h mpfr-3.1.5/src/mpfr.h |
---|
| 21 | --- mpfr-3.1.5.orig/src/mpfr.h 2016-09-27 07:58:15.000000000 +0000 |
---|
| 22 | +++ mpfr-3.1.5/src/mpfr.h 2017-05-10 23:18:31.782633324 +0000 |
---|
| 23 | @@ -27,7 +27,7 @@ |
---|
| 24 | #define MPFR_VERSION_MAJOR 3 |
---|
| 25 | #define MPFR_VERSION_MINOR 1 |
---|
| 26 | #define MPFR_VERSION_PATCHLEVEL 5 |
---|
| 27 | -#define MPFR_VERSION_STRING "3.1.5" |
---|
| 28 | +#define MPFR_VERSION_STRING "3.1.5-p2" |
---|
| 29 | |
---|
| 30 | /* Macros dealing with MPFR VERSION */ |
---|
| 31 | #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) |
---|
| 32 | diff -Naur mpfr-3.1.5.orig/src/strtofr.c mpfr-3.1.5/src/strtofr.c |
---|
| 33 | --- mpfr-3.1.5.orig/src/strtofr.c 2016-09-27 07:58:15.000000000 +0000 |
---|
| 34 | +++ mpfr-3.1.5/src/strtofr.c 2017-05-10 23:18:31.795634980 +0000 |
---|
| 35 | @@ -743,11 +743,14 @@ |
---|
| 36 | of the pstr_size most significant digits of pstr->mant, with |
---|
| 37 | equality in case exact is non-zero. */ |
---|
| 38 | |
---|
| 39 | - /* test if rounding is possible, and if so exit the loop */ |
---|
| 40 | - if (exact || mpfr_can_round_raw (result, ysize, |
---|
| 41 | - (pstr->negative) ? -1 : 1, |
---|
| 42 | - ysize_bits - err - 1, |
---|
| 43 | - MPFR_RNDN, rnd, MPFR_PREC(x))) |
---|
| 44 | + /* test if rounding is possible, and if so exit the loop. |
---|
| 45 | + Note: we also need to be able to determine the correct ternary value, |
---|
| 46 | + thus we use the MPFR_PREC(x) + (rnd == MPFR_RNDN) trick. |
---|
| 47 | + For example if result = xxx...xxx111...111 and rnd = RNDN, |
---|
| 48 | + then we know the correct rounding is xxx...xx(x+1), but we cannot know |
---|
| 49 | + the correct ternary value. */ |
---|
| 50 | + if (exact || mpfr_round_p (result, ysize, ysize_bits - err - 1, |
---|
| 51 | + MPFR_PREC(x) + (rnd == MPFR_RNDN))) |
---|
| 52 | break; |
---|
| 53 | |
---|
| 54 | next_loop: |
---|
| 55 | diff -Naur mpfr-3.1.5.orig/src/vasprintf.c mpfr-3.1.5/src/vasprintf.c |
---|
| 56 | --- mpfr-3.1.5.orig/src/vasprintf.c 2016-09-27 07:58:15.000000000 +0000 |
---|
| 57 | +++ mpfr-3.1.5/src/vasprintf.c 2017-05-10 23:18:31.741628100 +0000 |
---|
| 58 | @@ -1593,7 +1593,7 @@ |
---|
| 59 | } |
---|
| 60 | else if (spec.spec == 'f' || spec.spec == 'F') |
---|
| 61 | { |
---|
| 62 | - if (spec.prec == -1) |
---|
| 63 | + if (spec.prec < 0) |
---|
| 64 | spec.prec = 6; |
---|
| 65 | if (regular_fg (np, p, spec, NULL) == -1) |
---|
| 66 | goto error; |
---|
| 67 | diff -Naur mpfr-3.1.5.orig/src/version.c mpfr-3.1.5/src/version.c |
---|
| 68 | --- mpfr-3.1.5.orig/src/version.c 2016-09-27 07:58:15.000000000 +0000 |
---|
| 69 | +++ mpfr-3.1.5/src/version.c 2017-05-10 23:18:31.806636381 +0000 |
---|
| 70 | @@ -25,5 +25,5 @@ |
---|
| 71 | const char * |
---|
| 72 | mpfr_get_version (void) |
---|
| 73 | { |
---|
| 74 | - return "3.1.5"; |
---|
| 75 | + return "3.1.5-p2"; |
---|
| 76 | } |
---|
| 77 | diff -Naur mpfr-3.1.5.orig/tests/tsprintf.c mpfr-3.1.5/tests/tsprintf.c |
---|
| 78 | --- mpfr-3.1.5.orig/tests/tsprintf.c 2016-09-27 07:58:14.000000000 +0000 |
---|
| 79 | +++ mpfr-3.1.5/tests/tsprintf.c 2017-05-10 23:18:31.754629756 +0000 |
---|
| 80 | @@ -1251,6 +1251,25 @@ |
---|
| 81 | check_emin_aux (MPFR_EMIN_MIN); |
---|
| 82 | } |
---|
| 83 | |
---|
| 84 | +static void |
---|
| 85 | +test20161214 (void) |
---|
| 86 | +{ |
---|
| 87 | + mpfr_t x; |
---|
| 88 | + char buf[32]; |
---|
| 89 | + const char s[] = "0x0.fffffffffffff8p+1024"; |
---|
| 90 | + int r; |
---|
| 91 | + |
---|
| 92 | + mpfr_init2 (x, 64); |
---|
| 93 | + mpfr_set_str (x, s, 16, MPFR_RNDN); |
---|
| 94 | + r = mpfr_snprintf (buf, 32, "%.*RDf", -2, x); |
---|
| 95 | + MPFR_ASSERTN(r == 316); |
---|
| 96 | + r = mpfr_snprintf (buf, 32, "%.*RDf", INT_MIN + 1, x); |
---|
| 97 | + MPFR_ASSERTN(r == 316); |
---|
| 98 | + r = mpfr_snprintf (buf, 32, "%.*RDf", INT_MIN, x); |
---|
| 99 | + MPFR_ASSERTN(r == 316); |
---|
| 100 | + mpfr_clear (x); |
---|
| 101 | +} |
---|
| 102 | + |
---|
| 103 | int |
---|
| 104 | main (int argc, char **argv) |
---|
| 105 | { |
---|
| 106 | @@ -1271,6 +1290,7 @@ |
---|
| 107 | mixed (); |
---|
| 108 | check_emax (); |
---|
| 109 | check_emin (); |
---|
| 110 | + test20161214 (); |
---|
| 111 | |
---|
| 112 | #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE) |
---|
| 113 | #if MPFR_LCONV_DPTS |
---|
| 114 | diff -Naur mpfr-3.1.5.orig/tests/tstrtofr.c mpfr-3.1.5/tests/tstrtofr.c |
---|
| 115 | --- mpfr-3.1.5.orig/tests/tstrtofr.c 2016-09-27 07:58:14.000000000 +0000 |
---|
| 116 | +++ mpfr-3.1.5/tests/tstrtofr.c 2017-05-10 23:18:31.811637019 +0000 |
---|
| 117 | @@ -1191,6 +1191,24 @@ |
---|
| 118 | mpfr_clears (e, x1, x2, (mpfr_ptr) 0); |
---|
| 119 | } |
---|
| 120 | |
---|
| 121 | +/* Note: the number is 5^47/2^9. */ |
---|
| 122 | +static void |
---|
| 123 | +bug20161217 (void) |
---|
| 124 | +{ |
---|
| 125 | + mpfr_t fp, z; |
---|
| 126 | + static const char * num = "0.1387778780781445675529539585113525390625e31"; |
---|
| 127 | + int inex; |
---|
| 128 | + |
---|
| 129 | + mpfr_init2 (fp, 110); |
---|
| 130 | + mpfr_init2 (z, 110); |
---|
| 131 | + inex = mpfr_strtofr (fp, num, NULL, 10, MPFR_RNDN); |
---|
| 132 | + MPFR_ASSERTN(inex == 0); |
---|
| 133 | + mpfr_set_str_binary (z, "10001100001000010011110110011101101001010000001011011110010001010100010100100110111101000010001011001100001101E-9"); |
---|
| 134 | + MPFR_ASSERTN(mpfr_equal_p (fp, z)); |
---|
| 135 | + mpfr_clear (fp); |
---|
| 136 | + mpfr_clear (z); |
---|
| 137 | +} |
---|
| 138 | + |
---|
| 139 | int |
---|
| 140 | main (int argc, char *argv[]) |
---|
| 141 | { |
---|
| 142 | @@ -1205,6 +1223,7 @@ |
---|
| 143 | test20100310 (); |
---|
| 144 | bug20120814 (); |
---|
| 145 | bug20120829 (); |
---|
| 146 | + bug20161217 (); |
---|
| 147 | |
---|
| 148 | tests_end_mpfr (); |
---|
| 149 | return 0; |
---|