diff -Naurd mpfr-2.3.0-a/Makefile.am mpfr-2.3.0-b/Makefile.am --- mpfr-2.3.0-a/Makefile.am 2007-08-29 10:18:11.000000000 +0000 +++ mpfr-2.3.0-b/Makefile.am 2007-09-02 23:19:32.000000000 +0000 @@ -32,8 +32,13 @@ MAKEINFOFLAGS = --enable-encoding -get_patches.c: PATCHES get_patches.sh - ./get_patches.sh > $@ || rm -f $@ +# Important note: If for some reason, srcdir is read-only at build time +# (and you use objdir != srcdir), then you need to rebuild get_patches.c +# (with "make get_patches.c") just after patching the MPFR source. This +# should not be a problem in practice, in particular because "make dist" +# automatically rebuilds get_patches.c before generating the archives. +$(srcdir)/get_patches.c: PATCHES get_patches.sh + (cd $(srcdir) && ./get_patches.sh) > $@ || rm -f $@ # Do not add get_patches.c to CLEANFILES so that this file doesn't # need to be (re)built as long as no patches are applied. Anyway the diff -Naurd mpfr-2.3.0-a/Makefile.in mpfr-2.3.0-b/Makefile.in --- mpfr-2.3.0-a/Makefile.in 2007-08-29 10:27:18.000000000 +0000 +++ mpfr-2.3.0-b/Makefile.in 2007-09-02 23:59:30.000000000 +0000 @@ -1665,8 +1665,13 @@ uninstall-info-am uninstall-libLTLIBRARIES -get_patches.c: PATCHES get_patches.sh - ./get_patches.sh > $@ || rm -f $@ +# Important note: If for some reason, srcdir is read-only at build time +# (and you use objdir != srcdir), then you need to rebuild get_patches.c +# (with "make get_patches.c") just after patching the MPFR source. This +# should not be a problem in practice, in particular because "make dist" +# automatically rebuilds get_patches.c before generating the archives. +$(srcdir)/get_patches.c: PATCHES get_patches.sh + (cd $(srcdir) && ./get_patches.sh) > $@ || rm -f $@ tune: $(MAKE) $(AM_MAKEFLAGS) tuneup$(EXEEXT) diff -Naurd mpfr-2.3.0-a/PATCHES mpfr-2.3.0-b/PATCHES --- mpfr-2.3.0-a/PATCHES 2007-08-29 10:18:11.000000000 +0000 +++ mpfr-2.3.0-b/PATCHES 2007-09-02 23:59:50.000000000 +0000 @@ -0,0 +1 @@ +get_patches diff -Naurd mpfr-2.3.0-a/VERSION mpfr-2.3.0-b/VERSION --- mpfr-2.3.0-a/VERSION 2007-08-29 10:18:11.000000000 +0000 +++ mpfr-2.3.0-b/VERSION 2007-09-02 23:55:55.000000000 +0000 @@ -1 +1 @@ -2.3.0 +2.3.0-p1 diff -Naurd mpfr-2.3.0-a/mpfr.h mpfr-2.3.0-b/mpfr.h --- mpfr-2.3.0-a/mpfr.h 2007-08-29 10:18:11.000000000 +0000 +++ mpfr-2.3.0-b/mpfr.h 2007-09-02 23:55:55.000000000 +0000 @@ -27,7 +27,7 @@ #define MPFR_VERSION_MAJOR 2 #define MPFR_VERSION_MINOR 3 #define MPFR_VERSION_PATCHLEVEL 0 -#define MPFR_VERSION_STRING "2.3.0" +#define MPFR_VERSION_STRING "2.3.0-p1" /* Macros dealing with MPFR VERSION */ #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) diff -Naurd mpfr-2.3.0-a/tests/tversion.c mpfr-2.3.0-b/tests/tversion.c --- mpfr-2.3.0-a/tests/tversion.c 2007-08-29 10:18:10.000000000 +0000 +++ mpfr-2.3.0-b/tests/tversion.c 2007-09-02 23:55:55.000000000 +0000 @@ -46,7 +46,7 @@ version = mpfr_get_version (); /* This test is disabled when a suffix (e.g. -dev) has been defined. */ -#if 1 +#if 0 sprintf (buffer, "%d.%d.%d", MPFR_VERSION_MAJOR, MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL); if (strcmp (buffer, version) != 0) diff -Naurd mpfr-2.3.0-a/version.c mpfr-2.3.0-b/version.c --- mpfr-2.3.0-a/version.c 2007-08-29 10:18:11.000000000 +0000 +++ mpfr-2.3.0-b/version.c 2007-09-02 23:55:55.000000000 +0000 @@ -25,5 +25,5 @@ const char * mpfr_get_version (void) { - return "2.3.0"; + return "2.3.0-p1"; } diff -Naurd mpfr-2.3.0-a/PATCHES mpfr-2.3.0-b/PATCHES --- mpfr-2.3.0-a/PATCHES 2007-08-29 10:18:11.000000000 +0000 +++ mpfr-2.3.0-b/PATCHES 2007-09-03 00:03:46.000000000 +0000 @@ -0,0 +1 @@ +mpfr_acosh diff -Naurd mpfr-2.3.0-a/VERSION mpfr-2.3.0-b/VERSION --- mpfr-2.3.0-a/VERSION 2007-09-02 23:55:55.000000000 +0000 +++ mpfr-2.3.0-b/VERSION 2007-09-03 00:02:12.000000000 +0000 @@ -1 +1 @@ -2.3.0-p1 +2.3.0-p2 diff -Naurd mpfr-2.3.0-a/acosh.c mpfr-2.3.0-b/acosh.c --- mpfr-2.3.0-a/acosh.c 2007-08-29 10:18:11.000000000 +0000 +++ mpfr-2.3.0-b/acosh.c 2007-08-31 17:20:08.000000000 +0000 @@ -73,7 +73,7 @@ /* Declaration of the size variables */ mp_prec_t Ny = MPFR_PREC(y); /* Precision of output variable */ mp_prec_t Nt; /* Precision of the intermediary variable */ - mp_exp_t err, exp_te, exp_ti; /* Precision of error */ + mp_exp_t err, exp_te, d; /* Precision of error */ MPFR_ZIV_DECL (loop); /* compute the precision of intermediary variable */ @@ -91,13 +91,35 @@ mpfr_mul (t, x, x, GMP_RNDD); /* x^2 */ exp_te = MPFR_GET_EXP (t); mpfr_sub_ui (t, t, 1, GMP_RNDD); /* x^2-1 */ - exp_ti = MPFR_GET_EXP (t); - mpfr_sqrt (t, t, GMP_RNDN); /* sqrt(x^2-1) */ - mpfr_add (t, t, x, GMP_RNDN); /* sqrt(x^2-1)+x */ - mpfr_log (t, t, GMP_RNDN); /* ln(sqrt(x^2-1)+x)*/ + if (MPFR_UNLIKELY (MPFR_IS_ZERO (t))) + { + mpfr_t z; + + /* This means that x is very close to 1: x = 1 + z with + z < 2^(-Nt). Instead of increasing the precision, let's + compute x^2-1 by (x+1)(x-1) with an accuracy of about + Nt bits. */ + mpfr_init2 (z, Nt); + mpfr_add_ui (t, x, 1, GMP_RNDD); + mpfr_sub_ui (z, x, 1, GMP_RNDD); + mpfr_mul (t, t, z, GMP_RNDD); + d = 2; + mpfr_sqrt (t, t, GMP_RNDN); /* sqrt(x^2-1) */ + mpfr_add (t, t, z, GMP_RNDN); /* sqrt(x^2-1)+z */ + mpfr_clear (z); + mpfr_log1p (t, t, GMP_RNDN); /* log1p(sqrt(x^2-1)+z) */ + } + else + { + d = exp_te - MPFR_GET_EXP (t); + d = MAX (1, d); + mpfr_sqrt (t, t, GMP_RNDN); /* sqrt(x^2-1) */ + mpfr_add (t, t, x, GMP_RNDN); /* sqrt(x^2-1)+x */ + mpfr_log (t, t, GMP_RNDN); /* ln(sqrt(x^2-1)+x) */ + } /* error estimate -- see algorithms.tex */ - err = 3 + MAX (1, exp_te - exp_ti) - MPFR_GET_EXP(t); + err = 3 + d - MPFR_GET_EXP (t); /* error is bounded by 1/2 + 2^err <= 2^(1+max(-1,err)) */ err = 1 + MAX (-1, err); if (MPFR_LIKELY (MPFR_CAN_ROUND (t, Nt - err, Ny, rnd_mode))) @@ -117,9 +139,3 @@ MPFR_SAVE_EXPO_FREE (expo); return mpfr_check_range (y, inexact, rnd_mode); } - - - - - - diff -Naurd mpfr-2.3.0-a/mpfr.h mpfr-2.3.0-b/mpfr.h --- mpfr-2.3.0-a/mpfr.h 2007-09-02 23:55:55.000000000 +0000 +++ mpfr-2.3.0-b/mpfr.h 2007-09-03 00:02:12.000000000 +0000 @@ -27,7 +27,7 @@ #define MPFR_VERSION_MAJOR 2 #define MPFR_VERSION_MINOR 3 #define MPFR_VERSION_PATCHLEVEL 0 -#define MPFR_VERSION_STRING "2.3.0-p1" +#define MPFR_VERSION_STRING "2.3.0-p2" /* Macros dealing with MPFR VERSION */ #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) diff -Naurd mpfr-2.3.0-a/tests/tacosh.c mpfr-2.3.0-b/tests/tacosh.c --- mpfr-2.3.0-a/tests/tacosh.c 2007-08-29 10:18:10.000000000 +0000 +++ mpfr-2.3.0-b/tests/tacosh.c 2007-08-31 17:20:00.000000000 +0000 @@ -123,12 +123,40 @@ mpfr_clear (y); } +/* With MPFR 2.3.0, this yields an assertion failure in mpfr_acosh. */ +static void +bug20070831 (void) +{ + mpfr_t x, y, z; + int inex; + + mpfr_init2 (x, 256); + mpfr_init2 (y, 32); + mpfr_init2 (z, 32); + mpfr_set_ui (x, 1, GMP_RNDN); + mpfr_nextabove (x); + inex = mpfr_acosh (y, x, GMP_RNDZ); + mpfr_set_ui_2exp (z, 1, -127, GMP_RNDN); + mpfr_nextbelow (z); + MPFR_ASSERTN (inex < 0); + if (!mpfr_equal_p (y, z)) + { + printf ("Error in bug20070831:\nexpected "); + mpfr_dump (z); + printf ("got "); + mpfr_dump (y); + exit (1); + } + mpfr_clears (x, y, z, (void *) 0); +} + int main (int argc, char *argv[]) { tests_start_mpfr (); special (); + bug20070831 (); test_generic (2, 100, 25); diff -Naurd mpfr-2.3.0-a/version.c mpfr-2.3.0-b/version.c --- mpfr-2.3.0-a/version.c 2007-09-02 23:55:55.000000000 +0000 +++ mpfr-2.3.0-b/version.c 2007-09-03 00:02:12.000000000 +0000 @@ -25,5 +25,5 @@ const char * mpfr_get_version (void) { - return "2.3.0-p1"; + return "2.3.0-p2"; }