提交 cb8fce4b 编写于 作者: N nsz

fix tgammal: don't set the signgam global

(tgamma must be thread-safe, signgam is for lgamma* functions)
上级 494ba80e
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
* SYNOPSIS: * SYNOPSIS:
* *
* long double x, y, tgammal(); * long double x, y, tgammal();
* extern int signgam;
* *
* y = tgammal( x ); * y = tgammal( x );
* *
...@@ -29,10 +28,7 @@ ...@@ -29,10 +28,7 @@
* DESCRIPTION: * DESCRIPTION:
* *
* Returns gamma function of the argument. The result is * Returns gamma function of the argument. The result is
* correctly signed, and the sign (+1 or -1) is also * correctly signed.
* returned in a global (extern) variable named signgam.
* This variable is also filled in by the logarithmic gamma
* function lgamma().
* *
* Arguments |x| <= 13 are reduced by recurrence and the function * Arguments |x| <= 13 are reduced by recurrence and the function
* approximated by a rational function of degree 7/8 in the * approximated by a rational function of degree 7/8 in the
...@@ -209,9 +205,8 @@ static long double stirf(long double x) ...@@ -209,9 +205,8 @@ static long double stirf(long double x)
long double tgammal(long double x) long double tgammal(long double x)
{ {
long double p, q, z; long double p, q, z;
int i; int i, sign;
signgam = 1;
if (isnan(x)) if (isnan(x))
return NAN; return NAN;
if (x == INFINITY) if (x == INFINITY)
...@@ -220,6 +215,7 @@ long double tgammal(long double x) ...@@ -220,6 +215,7 @@ long double tgammal(long double x)
return x - x; return x - x;
q = fabsl(x); q = fabsl(x);
if (q > 13.0) { if (q > 13.0) {
sign = 1;
if (q > MAXGAML) if (q > MAXGAML)
goto goverf; goto goverf;
if (x < 0.0) { if (x < 0.0) {
...@@ -228,7 +224,7 @@ long double tgammal(long double x) ...@@ -228,7 +224,7 @@ long double tgammal(long double x)
return (x - x) / (x - x); return (x - x) / (x - x);
i = p; i = p;
if ((i & 1) == 0) if ((i & 1) == 0)
signgam = -1; sign = -1;
z = q - p; z = q - p;
if (z > 0.5L) { if (z > 0.5L) {
p += 1.0; p += 1.0;
...@@ -238,13 +234,13 @@ long double tgammal(long double x) ...@@ -238,13 +234,13 @@ long double tgammal(long double x)
z = fabsl(z) * stirf(q); z = fabsl(z) * stirf(q);
if (z <= PIL/LDBL_MAX) { if (z <= PIL/LDBL_MAX) {
goverf: goverf:
return signgam * INFINITY; return sign * INFINITY;
} }
z = PIL/z; z = PIL/z;
} else { } else {
z = stirf(x); z = stirf(x);
} }
return signgam * z; return sign * z;
} }
z = 1.0; z = 1.0;
...@@ -269,8 +265,6 @@ goverf: ...@@ -269,8 +265,6 @@ goverf:
p = __polevll(x, P, 7); p = __polevll(x, P, 7);
q = __polevll(x, Q, 8); q = __polevll(x, Q, 8);
z = z * p / q; z = z * p / q;
if(z < 0)
signgam = -1;
return z; return z;
small: small:
...@@ -279,7 +273,6 @@ small: ...@@ -279,7 +273,6 @@ small:
if (x < 0.0) { if (x < 0.0) {
x = -x; x = -x;
q = z / (x * __polevll(x, SN, 8)); q = z / (x * __polevll(x, SN, 8));
signgam = -1;
} else } else
q = z / (x * __polevll(x, S, 8)); q = z / (x * __polevll(x, S, 8));
return q; return q;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册