[gnumeric] BETA: fix win32 fallback for lgamma_r.



commit 82b3368c1460c7bdf5f3138daa85126b3ff437b2
Author: Morten Welinder <terra gnome org>
Date:   Wed Nov 13 19:27:06 2013 -0500

    BETA: fix win32 fallback for lgamma_r.

 ChangeLog      |    4 ++++
 NEWS           |    1 +
 src/mathfunc.c |   26 ++++++++++++++++++++++++--
 3 files changed, 29 insertions(+), 2 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 9738c43..f6cd360 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-11-13  Morten Welinder  <terra gnome org>
+
+       * src/mathfunc.c (lgamma_r): Fix fallback.  Didn't work for x<10.
+
 2013-11-13  Jean Brefort  <jean brefort normalesup org>
 
        * src/sheet-object.c (sheet_object_view_button2_pressed),
diff --git a/NEWS b/NEWS
index d9cf94c..ae6f5bc 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,7 @@ Morten:
        * Improve accuracy of ACOTH.
        * Fix fuzzed file crash.  [#708091]
        * Restore sheet reordering by drag.
+       * Fix BETA on win32.
 
 Xabier Rodríguez Calvar:
        * Fix dialog button order. [#710378]
diff --git a/src/mathfunc.c b/src/mathfunc.c
index 10e58ff..3c11b5a 100644
--- a/src/mathfunc.c
+++ b/src/mathfunc.c
@@ -8681,9 +8681,31 @@ lgamma (double x)
 double
 lgamma_r (double x, int *signp)
 {
-       *signp = (x >= 0 || fmod (floor (-x), 2.0) != 0.0) ? +1 : -1;
+       *signp = +1;
 
-       return M_LN_SQRT_2PI + (x - 0.5) * log(x) - x + lgammacor(x);
+       if (gnm_isnan (x))
+               return gnm_nan;
+
+       if (x > 0) {
+               gnm_float f = 1;
+
+               while (x < 10) {
+                       f *= x;
+                       x++;
+               }
+
+               return (M_LN_SQRT_2PI + (x - 0.5) * gnm_log(x) -
+                       x + lgammacor(x)) - gnm_log (f);
+       } else {
+               gnm_float axm2 = gnm_fmod (-x, 2.0);
+               gnm_float y = gnm_sin (M_PIgnum * axm2) / M_PIgnum;
+
+               *signp = axm2 > 1.0 ? +1 : -1;
+
+               return y == 0
+                       ? gnm_nan
+                       : - gnm_log (gnm_abs (y)) - lgamma1p (-x);
+       }
 }
 #endif
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]