| diff -Naurd mpfr-3.0.1-a/PATCHES mpfr-3.0.1-b/PATCHES |
| --- mpfr-3.0.1-a/PATCHES 2011-04-12 10:50:02.000000000 +0000 |
| +++ mpfr-3.0.1-b/PATCHES 2011-04-12 10:50:02.000000000 +0000 |
| @@ -0,0 +1 @@ |
| +asin_exprange |
| diff -Naurd mpfr-3.0.1-a/VERSION mpfr-3.0.1-b/VERSION |
| --- mpfr-3.0.1-a/VERSION 2011-04-04 10:19:18.000000000 +0000 |
| +++ mpfr-3.0.1-b/VERSION 2011-04-12 10:50:02.000000000 +0000 |
| @@ -1 +1 @@ |
| -3.0.1 |
| +3.0.1-p1 |
| diff -Naurd mpfr-3.0.1-a/asin.c mpfr-3.0.1-b/asin.c |
| --- mpfr-3.0.1-a/asin.c 2011-04-04 10:19:18.000000000 +0000 |
| +++ mpfr-3.0.1-b/asin.c 2011-04-12 10:50:02.000000000 +0000 |
| @@ -63,11 +63,14 @@ |
| |
| compared = mpfr_cmp_ui (xp, 1); |
| |
| + MPFR_SAVE_EXPO_MARK (expo); |
| + |
| if (MPFR_UNLIKELY (compared >= 0)) |
| { |
| mpfr_clear (xp); |
| if (compared > 0) /* asin(x) = NaN for |x| > 1 */ |
| { |
| + MPFR_SAVE_EXPO_FREE (expo); |
| MPFR_SET_NAN (asin); |
| MPFR_RET_NAN; |
| } |
| @@ -80,13 +83,11 @@ |
| inexact = -mpfr_const_pi (asin, MPFR_INVERT_RND(rnd_mode)); |
| MPFR_CHANGE_SIGN (asin); |
| } |
| - mpfr_div_2ui (asin, asin, 1, rnd_mode); /* May underflow */ |
| - return inexact; |
| + mpfr_div_2ui (asin, asin, 1, rnd_mode); |
| } |
| } |
| - |
| - MPFR_SAVE_EXPO_MARK (expo); |
| - |
| + else |
| + { |
| /* Compute exponent of 1 - ABS(x) */ |
| mpfr_ui_sub (xp, 1, xp, MPFR_RNDD); |
| MPFR_ASSERTD (MPFR_GET_EXP (xp) <= 0); |
| @@ -115,6 +116,7 @@ |
| inexact = mpfr_set (asin, xp, rnd_mode); |
| |
| mpfr_clear (xp); |
| + } |
| |
| MPFR_SAVE_EXPO_FREE (expo); |
| return mpfr_check_range (asin, inexact, rnd_mode); |
| diff -Naurd mpfr-3.0.1-a/mpfr.h mpfr-3.0.1-b/mpfr.h |
| --- mpfr-3.0.1-a/mpfr.h 2011-04-04 10:19:18.000000000 +0000 |
| +++ mpfr-3.0.1-b/mpfr.h 2011-04-12 10:50:02.000000000 +0000 |
| @@ -27,7 +27,7 @@ |
| #define MPFR_VERSION_MAJOR 3 |
| #define MPFR_VERSION_MINOR 0 |
| #define MPFR_VERSION_PATCHLEVEL 1 |
| -#define MPFR_VERSION_STRING "3.0.1" |
| +#define MPFR_VERSION_STRING "3.0.1-p1" |
| |
| /* Macros dealing with MPFR VERSION */ |
| #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) |
| diff -Naurd mpfr-3.0.1-a/tests/tasin.c mpfr-3.0.1-b/tests/tasin.c |
| --- mpfr-3.0.1-a/tests/tasin.c 2011-04-04 10:19:17.000000000 +0000 |
| +++ mpfr-3.0.1-b/tests/tasin.c 2011-04-12 10:50:02.000000000 +0000 |
| @@ -219,6 +219,49 @@ |
| mpfr_clear (y); |
| } |
| |
| +static void |
| +reduced_expo_range (void) |
| +{ |
| + mpfr_exp_t emin, emax; |
| + mpfr_t x, y, ex_y; |
| + int inex, ex_inex; |
| + unsigned int flags, ex_flags; |
| + |
| + emin = mpfr_get_emin (); |
| + emax = mpfr_get_emax (); |
| + |
| + mpfr_inits2 (4, x, y, ex_y, (mpfr_ptr) 0); |
| + mpfr_set_str (x, "-0.1e1", 2, MPFR_RNDN); |
| + |
| + mpfr_set_emin (1); |
| + mpfr_set_emax (1); |
| + mpfr_clear_flags (); |
| + inex = mpfr_asin (y, x, MPFR_RNDA); |
| + flags = __gmpfr_flags; |
| + mpfr_set_emin (emin); |
| + mpfr_set_emax (emax); |
| + |
| + mpfr_set_str (ex_y, "-0.1101e1", 2, MPFR_RNDN); |
| + ex_inex = -1; |
| + ex_flags = MPFR_FLAGS_INEXACT; |
| + |
| + if (SIGN (inex) != ex_inex || flags != ex_flags || |
| + ! mpfr_equal_p (y, ex_y)) |
| + { |
| + printf ("Error in reduced_expo_range\non x = "); |
| + mpfr_dump (x); |
| + printf ("Expected y = "); |
| + mpfr_out_str (stdout, 2, 0, ex_y, MPFR_RNDN); |
| + printf ("\n inex = %d, flags = %u\n", ex_inex, ex_flags); |
| + printf ("Got y = "); |
| + mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN); |
| + printf ("\n inex = %d, flags = %u\n", SIGN (inex), flags); |
| + exit (1); |
| + } |
| + |
| + mpfr_clears (x, y, ex_y, (mpfr_ptr) 0); |
| +} |
| + |
| int |
| main (void) |
| { |
| @@ -226,6 +269,7 @@ |
| |
| special (); |
| special_overflow (); |
| + reduced_expo_range (); |
| |
| test_generic (2, 100, 15); |
| |
| diff -Naurd mpfr-3.0.1-a/version.c mpfr-3.0.1-b/version.c |
| --- mpfr-3.0.1-a/version.c 2011-04-04 10:19:18.000000000 +0000 |
| +++ mpfr-3.0.1-b/version.c 2011-04-12 10:50:02.000000000 +0000 |
| @@ -25,5 +25,5 @@ |
| const char * |
| mpfr_get_version (void) |
| { |
| - return "3.0.1"; |
| + return "3.0.1-p1"; |
| } |
| diff -Naurd mpfr-3.0.1-a/PATCHES mpfr-3.0.1-b/PATCHES |
| --- mpfr-3.0.1-a/PATCHES 2011-05-04 11:18:33.000000000 +0000 |
| +++ mpfr-3.0.1-b/PATCHES 2011-05-04 11:18:33.000000000 +0000 |
| @@ -0,0 +1 @@ |
| +rec_sqrt-carry |
| diff -Naurd mpfr-3.0.1-a/VERSION mpfr-3.0.1-b/VERSION |
| --- mpfr-3.0.1-a/VERSION 2011-04-12 10:50:02.000000000 +0000 |
| +++ mpfr-3.0.1-b/VERSION 2011-05-04 11:18:33.000000000 +0000 |
| @@ -1 +1 @@ |
| -3.0.1-p1 |
| +3.0.1-p2 |
| diff -Naurd mpfr-3.0.1-a/mpfr.h mpfr-3.0.1-b/mpfr.h |
| --- mpfr-3.0.1-a/mpfr.h 2011-04-12 10:50:02.000000000 +0000 |
| +++ mpfr-3.0.1-b/mpfr.h 2011-05-04 11:18:33.000000000 +0000 |
| @@ -27,7 +27,7 @@ |
| #define MPFR_VERSION_MAJOR 3 |
| #define MPFR_VERSION_MINOR 0 |
| #define MPFR_VERSION_PATCHLEVEL 1 |
| -#define MPFR_VERSION_STRING "3.0.1-p1" |
| +#define MPFR_VERSION_STRING "3.0.1-p2" |
| |
| /* Macros dealing with MPFR VERSION */ |
| #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) |
| diff -Naurd mpfr-3.0.1-a/rec_sqrt.c mpfr-3.0.1-b/rec_sqrt.c |
| --- mpfr-3.0.1-a/rec_sqrt.c 2011-04-04 10:19:18.000000000 +0000 |
| +++ mpfr-3.0.1-b/rec_sqrt.c 2011-05-04 11:18:33.000000000 +0000 |
| @@ -375,20 +375,37 @@ |
| MPFR_ASSERTD(un == ln + 1 || un == ln + 2); |
| /* the high un-ln limbs of u will overlap the low part of {x+ln,xn}, |
| we need to add or subtract the overlapping part {u + ln, un - ln} */ |
| + /* Warning! th may be 0, in which case the mpn_add_1 and mpn_sub_1 |
| + below (with size = th) mustn't be used. In such a case, the limb |
| + (carry) will be 0, so that this is semantically a no-op, but if |
| + mpn_add_1 and mpn_sub_1 are used, GMP (currently) still does a |
| + non-atomic read/write in a place that is not always allocated, |
| + with the possible consequences: a crash if the corresponding |
| + address is not mapped, or (rather unlikely) memory corruption |
| + if another process/thread writes at the same place; things may |
| + be worse with future GMP versions. Hence the tests carry != 0. */ |
| if (neg == 0) |
| { |
| if (ln > 0) |
| MPN_COPY (x, u, ln); |
| cy = mpn_add (x + ln, x + ln, xn, u + ln, un - ln); |
| /* add cu at x+un */ |
| - cy += mpn_add_1 (x + un, x + un, th, cu); |
| + if (cu != 0) |
| + { |
| + MPFR_ASSERTD (th != 0); |
| + cy += mpn_add_1 (x + un, x + un, th, cu); |
| + } |
| } |
| else /* negative case */ |
| { |
| /* subtract {u+ln, un-ln} from {x+ln,un} */ |
| cy = mpn_sub (x + ln, x + ln, xn, u + ln, un - ln); |
| /* carry cy is at x+un, like cu */ |
| - cy = mpn_sub_1 (x + un, x + un, th, cy + cu); /* n - un = th */ |
| + if (cy + cu != 0) |
| + { |
| + MPFR_ASSERTD (th != 0); |
| + cy = mpn_sub_1 (x + un, x + un, th, cy + cu); /* n - un = th */ |
| + } |
| /* cy cannot be zero, since the most significant bit of Xh is 1, |
| and the correction is bounded by 2^{-h+3} */ |
| MPFR_ASSERTD(cy == 0); |
| diff -Naurd mpfr-3.0.1-a/version.c mpfr-3.0.1-b/version.c |
| --- mpfr-3.0.1-a/version.c 2011-04-12 10:50:02.000000000 +0000 |
| +++ mpfr-3.0.1-b/version.c 2011-05-04 11:18:33.000000000 +0000 |
| @@ -25,5 +25,5 @@ |
| const char * |
| mpfr_get_version (void) |
| { |
| - return "3.0.1-p1"; |
| + return "3.0.1-p2"; |
| } |
| diff -Naurd mpfr-3.0.1-a/PATCHES mpfr-3.0.1-b/PATCHES |
| --- mpfr-3.0.1-a/PATCHES 2011-05-05 00:00:35.000000000 +0000 |
| +++ mpfr-3.0.1-b/PATCHES 2011-05-05 00:00:35.000000000 +0000 |
| @@ -0,0 +1 @@ |
| +atan-expo-range |
| diff -Naurd mpfr-3.0.1-a/VERSION mpfr-3.0.1-b/VERSION |
| --- mpfr-3.0.1-a/VERSION 2011-05-04 11:18:33.000000000 +0000 |
| +++ mpfr-3.0.1-b/VERSION 2011-05-05 00:00:35.000000000 +0000 |
| @@ -1 +1 @@ |
| -3.0.1-p2 |
| +3.0.1-p3 |
| diff -Naurd mpfr-3.0.1-a/atan.c mpfr-3.0.1-b/atan.c |
| --- mpfr-3.0.1-a/atan.c 2011-04-04 10:19:18.000000000 +0000 |
| +++ mpfr-3.0.1-b/atan.c 2011-05-05 00:00:35.000000000 +0000 |
| @@ -431,5 +431,5 @@ |
| MPFR_GROUP_CLEAR (group); |
| |
| MPFR_SAVE_EXPO_FREE (expo); |
| - return mpfr_check_range (arctgt, inexact, rnd_mode); |
| + return mpfr_check_range (atan, inexact, rnd_mode); |
| } |
| diff -Naurd mpfr-3.0.1-a/mpfr.h mpfr-3.0.1-b/mpfr.h |
| --- mpfr-3.0.1-a/mpfr.h 2011-05-04 11:18:33.000000000 +0000 |
| +++ mpfr-3.0.1-b/mpfr.h 2011-05-05 00:00:35.000000000 +0000 |
| @@ -27,7 +27,7 @@ |
| #define MPFR_VERSION_MAJOR 3 |
| #define MPFR_VERSION_MINOR 0 |
| #define MPFR_VERSION_PATCHLEVEL 1 |
| -#define MPFR_VERSION_STRING "3.0.1-p2" |
| +#define MPFR_VERSION_STRING "3.0.1-p3" |
| |
| /* Macros dealing with MPFR VERSION */ |
| #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) |
| diff -Naurd mpfr-3.0.1-a/tests/tatan.c mpfr-3.0.1-b/tests/tatan.c |
| --- mpfr-3.0.1-a/tests/tatan.c 2011-04-04 10:19:17.000000000 +0000 |
| +++ mpfr-3.0.1-b/tests/tatan.c 2011-05-05 00:00:35.000000000 +0000 |
| @@ -535,6 +535,52 @@ |
| mpfr_clears (a, x, y, (mpfr_ptr) 0); |
| } |
| |
| +/* http://websympa.loria.fr/wwsympa/arc/mpfr/2011-05/msg00008.html |
| + * Incorrect flags (in debug mode on a 32-bit machine, assertion failure). |
| + */ |
| +static void |
| +reduced_expo_range (void) |
| +{ |
| + mpfr_exp_t emin, emax; |
| + mpfr_t x, y, ex_y; |
| + int inex, ex_inex; |
| + unsigned int flags, ex_flags; |
| + |
| + emin = mpfr_get_emin (); |
| + emax = mpfr_get_emax (); |
| + |
| + mpfr_inits2 (12, x, y, ex_y, (mpfr_ptr) 0); |
| + mpfr_set_str (x, "0.1e-5", 2, MPFR_RNDN); |
| + |
| + mpfr_set_emin (-5); |
| + mpfr_set_emax (-5); |
| + mpfr_clear_flags (); |
| + inex = mpfr_atan (y, x, MPFR_RNDN); |
| + flags = __gmpfr_flags; |
| + mpfr_set_emin (emin); |
| + mpfr_set_emax (emax); |
| + |
| + mpfr_set_str (ex_y, "0.1e-5", 2, MPFR_RNDN); |
| + ex_inex = 1; |
| + ex_flags = MPFR_FLAGS_INEXACT; |
| + |
| + if (SIGN (inex) != ex_inex || flags != ex_flags || |
| + ! mpfr_equal_p (y, ex_y)) |
| + { |
| + printf ("Error in reduced_expo_range\non x = "); |
| + mpfr_dump (x); |
| + printf ("Expected y = "); |
| + mpfr_out_str (stdout, 2, 0, ex_y, MPFR_RNDN); |
| + printf ("\n inex = %d, flags = %u\n", ex_inex, ex_flags); |
| + printf ("Got y = "); |
| + mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN); |
| + printf ("\n inex = %d, flags = %u\n", SIGN (inex), flags); |
| + exit (1); |
| + } |
| + |
| + mpfr_clears (x, y, ex_y, (mpfr_ptr) 0); |
| +} |
| + |
| int |
| main (int argc, char *argv[]) |
| { |
| @@ -546,6 +592,7 @@ |
| smallvals_atan2 (); |
| atan2_bug_20071003 (); |
| atan2_different_prec (); |
| + reduced_expo_range (); |
| |
| test_generic_atan (2, 200, 17); |
| test_generic_atan2 (2, 200, 17); |
| diff -Naurd mpfr-3.0.1-a/version.c mpfr-3.0.1-b/version.c |
| --- mpfr-3.0.1-a/version.c 2011-05-04 11:18:33.000000000 +0000 |
| +++ mpfr-3.0.1-b/version.c 2011-05-05 00:00:35.000000000 +0000 |
| @@ -25,5 +25,5 @@ |
| const char * |
| mpfr_get_version (void) |
| { |
| - return "3.0.1-p2"; |
| + return "3.0.1-p3"; |
| } |
| diff -Naurd mpfr-3.0.1-a/PATCHES mpfr-3.0.1-b/PATCHES |
| --- mpfr-3.0.1-a/PATCHES 2011-05-09 14:48:24.000000000 +0000 |
| +++ mpfr-3.0.1-b/PATCHES 2011-05-09 14:48:24.000000000 +0000 |
| @@ -0,0 +1 @@ |
| +texp-zero |
| diff -Naurd mpfr-3.0.1-a/VERSION mpfr-3.0.1-b/VERSION |
| --- mpfr-3.0.1-a/VERSION 2011-05-05 00:00:35.000000000 +0000 |
| +++ mpfr-3.0.1-b/VERSION 2011-05-09 14:48:24.000000000 +0000 |
| @@ -1 +1 @@ |
| -3.0.1-p3 |
| +3.0.1-p4 |
| diff -Naurd mpfr-3.0.1-a/mpfr.h mpfr-3.0.1-b/mpfr.h |
| --- mpfr-3.0.1-a/mpfr.h 2011-05-05 00:00:35.000000000 +0000 |
| +++ mpfr-3.0.1-b/mpfr.h 2011-05-09 14:48:24.000000000 +0000 |
| @@ -27,7 +27,7 @@ |
| #define MPFR_VERSION_MAJOR 3 |
| #define MPFR_VERSION_MINOR 0 |
| #define MPFR_VERSION_PATCHLEVEL 1 |
| -#define MPFR_VERSION_STRING "3.0.1-p3" |
| +#define MPFR_VERSION_STRING "3.0.1-p4" |
| |
| /* Macros dealing with MPFR VERSION */ |
| #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) |
| diff -Naurd mpfr-3.0.1-a/tests/texp.c mpfr-3.0.1-b/tests/texp.c |
| --- mpfr-3.0.1-a/tests/texp.c 2011-04-04 10:19:17.000000000 +0000 |
| +++ mpfr-3.0.1-b/tests/texp.c 2011-05-09 14:48:24.000000000 +0000 |
| @@ -170,7 +170,9 @@ |
| mpfr_set_prec (x, prec); |
| mpfr_set_prec (y, prec); |
| mpfr_set_prec (z, prec); |
| - mpfr_urandomb (x, RANDS); |
| + do |
| + mpfr_urandomb (x, RANDS); |
| + while (MPFR_IS_ZERO (x)); /* 0 is handled by mpfr_exp only */ |
| rnd = RND_RAND (); |
| mpfr_exp_2 (y, x, rnd); |
| mpfr_exp_3 (z, x, rnd); |
| diff -Naurd mpfr-3.0.1-a/version.c mpfr-3.0.1-b/version.c |
| --- mpfr-3.0.1-a/version.c 2011-05-05 00:00:35.000000000 +0000 |
| +++ mpfr-3.0.1-b/version.c 2011-05-09 14:48:24.000000000 +0000 |
| @@ -25,5 +25,5 @@ |
| const char * |
| mpfr_get_version (void) |
| { |
| - return "3.0.1-p3"; |
| + return "3.0.1-p4"; |
| } |