about summary refs log tree commit diff
path: root/src/math
diff options
context:
space:
mode:
authornsz <nsz@port70.net>2012-03-23 01:18:12 +0100
committernsz <nsz@port70.net>2012-03-23 01:18:12 +0100
commitcb8fce4b4fa4557641e8ca4cc7061a7de9e44749 (patch)
tree37d19f272255255a26ad55752591f97b646a2e5e /src/math
parent494ba80e9a7f43be76dfee908bbd40ad0b608041 (diff)
downloadmusl-cb8fce4b4fa4557641e8ca4cc7061a7de9e44749.tar.gz
musl-cb8fce4b4fa4557641e8ca4cc7061a7de9e44749.tar.xz
musl-cb8fce4b4fa4557641e8ca4cc7061a7de9e44749.zip
fix tgammal: don't set the signgam global
(tgamma must be thread-safe, signgam is for lgamma* functions)
Diffstat (limited to 'src/math')
-rw-r--r--src/math/tgammal.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/src/math/tgammal.c b/src/math/tgammal.c
index 1b460da5..86782a96 100644
--- a/src/math/tgammal.c
+++ b/src/math/tgammal.c
@@ -21,7 +21,6 @@
  * SYNOPSIS:
  *
  * long double x, y, tgammal();
- * extern int signgam;
  *
  * y = tgammal( x );
  *
@@ -29,10 +28,7 @@
  * DESCRIPTION:
  *
  * Returns gamma function of the argument.  The result is
- * correctly signed, and the sign (+1 or -1) is also
- * returned in a global (extern) variable named signgam.
- * This variable is also filled in by the logarithmic gamma
- * function lgamma().
+ * correctly signed.
  *
  * Arguments |x| <= 13 are reduced by recurrence and the function
  * approximated by a rational function of degree 7/8 in the
@@ -209,9 +205,8 @@ static long double stirf(long double x)
 long double tgammal(long double x)
 {
 	long double p, q, z;
-	int i;
+	int i, sign;
 
-	signgam = 1;
 	if (isnan(x))
 		return NAN;
 	if (x == INFINITY)
@@ -220,6 +215,7 @@ long double tgammal(long double x)
 		return x - x;
 	q = fabsl(x);
 	if (q > 13.0) {
+		sign = 1;
 		if (q > MAXGAML)
 			goto goverf;
 		if (x < 0.0) {
@@ -228,7 +224,7 @@ long double tgammal(long double x)
 				return (x - x) / (x - x);
 			i = p;
 			if ((i & 1) == 0)
-				signgam = -1;
+				sign = -1;
 			z = q - p;
 			if (z > 0.5L) {
 				p += 1.0;
@@ -238,13 +234,13 @@ long double tgammal(long double x)
 			z = fabsl(z) * stirf(q);
 			if (z <= PIL/LDBL_MAX) {
 goverf:
-				return signgam * INFINITY;
+				return sign * INFINITY;
 			}
 			z = PIL/z;
 		} else {
 			z = stirf(x);
 		}
-		return signgam * z;
+		return sign * z;
 	}
 
 	z = 1.0;
@@ -269,8 +265,6 @@ goverf:
 	p = __polevll(x, P, 7);
 	q = __polevll(x, Q, 8);
 	z = z * p / q;
-	if(z < 0)
-		signgam = -1;
 	return z;
 
 small:
@@ -279,7 +273,6 @@ small:
 	if (x < 0.0) {
 		x = -x;
 		q = z / (x * __polevll(x, SN, 8));
-		signgam = -1;
 	} else
 		q = z / (x * __polevll(x, S, 8));
 	return q;