summaryrefslogtreecommitdiff
path: root/patches/mpfr/3.1.0/190-gamma-underflow.patch
blob: 3de1d192d53707db6fd3e7f5d1506903a087a322 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES
--- mpfr-3.1.0-a/PATCHES	2012-04-27 01:13:15.000000000 +0000
+++ mpfr-3.1.0-b/PATCHES	2012-04-27 01:13:15.000000000 +0000
@@ -0,0 +1 @@
+gamma-underflow
diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION
--- mpfr-3.1.0-a/VERSION	2012-03-12 11:59:47.000000000 +0000
+++ mpfr-3.1.0-b/VERSION	2012-04-27 01:13:15.000000000 +0000
@@ -1 +1 @@
-3.1.0-p8
+3.1.0-p9
diff -Naurd mpfr-3.1.0-a/src/gamma.c mpfr-3.1.0-b/src/gamma.c
--- mpfr-3.1.0-a/src/gamma.c	2011-10-03 08:17:09.000000000 +0000
+++ mpfr-3.1.0-b/src/gamma.c	2012-04-27 01:13:15.000000000 +0000
@@ -296,7 +296,7 @@
       /* we want an upper bound for x * [log(2-x)-1].
          since x < 0, we need a lower bound on log(2-x) */
       mpfr_ui_sub (xp, 2, x, MPFR_RNDD);
-      mpfr_log2 (xp, xp, MPFR_RNDD);
+      mpfr_log (xp, xp, MPFR_RNDD);
       mpfr_sub_ui (xp, xp, 1, MPFR_RNDD);
       mpfr_mul (xp, xp, x, MPFR_RNDU);
 
diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h
--- mpfr-3.1.0-a/src/mpfr.h	2012-03-12 11:59:47.000000000 +0000
+++ mpfr-3.1.0-b/src/mpfr.h	2012-04-27 01:13:15.000000000 +0000
@@ -27,7 +27,7 @@
 #define MPFR_VERSION_MAJOR 3
 #define MPFR_VERSION_MINOR 1
 #define MPFR_VERSION_PATCHLEVEL 0
-#define MPFR_VERSION_STRING "3.1.0-p8"
+#define MPFR_VERSION_STRING "3.1.0-p9"
 
 /* Macros dealing with MPFR VERSION */
 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c
--- mpfr-3.1.0-a/src/version.c	2012-03-12 11:59:47.000000000 +0000
+++ mpfr-3.1.0-b/src/version.c	2012-04-27 01:13:15.000000000 +0000
@@ -25,5 +25,5 @@
 const char *
 mpfr_get_version (void)
 {
-  return "3.1.0-p8";
+  return "3.1.0-p9";
 }
diff -Naurd mpfr-3.1.0-a/tests/tgamma.c mpfr-3.1.0-b/tests/tgamma.c
--- mpfr-3.1.0-a/tests/tgamma.c	2011-10-03 08:17:14.000000000 +0000
+++ mpfr-3.1.0-b/tests/tgamma.c	2012-04-27 01:13:15.000000000 +0000
@@ -478,6 +478,36 @@
   mpfr_clear (x);
 }
 
+/* bug found by Giridhar Tammana */
+static void
+test20120426 (void)
+{
+  mpfr_t xa, xb;
+  int i;
+  mpfr_exp_t emin;
+
+  mpfr_init2 (xa, 53);
+  mpfr_init2 (xb, 53);
+  mpfr_set_d (xb, -168.5, MPFR_RNDN);
+  emin = mpfr_get_emin ();
+  mpfr_set_emin (-1073);
+  i = mpfr_gamma (xa, xb, MPFR_RNDN);
+  i = mpfr_subnormalize (xa, i, MPFR_RNDN); /* new ternary value */
+  mpfr_set_str (xb, "-9.5737343987585366746184749943e-304", 10, MPFR_RNDN);
+  if (!((i > 0) && (mpfr_cmp (xa, xb) == 0)))
+    {
+      printf ("Error in test20120426, i=%d\n", i);
+      printf ("expected ");
+      mpfr_print_binary (xb); putchar ('\n');
+      printf ("got      ");
+      mpfr_print_binary (xa); putchar ('\n');
+      exit (1);
+    }
+  mpfr_set_emin (emin);
+  mpfr_clear (xa);
+  mpfr_clear (xb);
+}
+
 static void
 exprange (void)
 {
@@ -821,6 +851,7 @@
   gamma_integer ();
   test20071231 ();
   test20100709 ();
+  test20120426 ();
 
   data_check ("data/gamma", mpfr_gamma, "mpfr_gamma");