aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/libm-ieee754
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/libm-ieee754')
-rw-r--r--sysdeps/libm-ieee754/k_standard.c3
-rw-r--r--sysdeps/libm-ieee754/w_gamma.c26
-rw-r--r--sysdeps/libm-ieee754/w_gammaf.c32
-rw-r--r--sysdeps/libm-ieee754/w_gammal.c26
4 files changed, 62 insertions, 25 deletions
diff --git a/sysdeps/libm-ieee754/k_standard.c b/sysdeps/libm-ieee754/k_standard.c
index aeaa50f2ee..82cfbe467a 100644
--- a/sysdeps/libm-ieee754/k_standard.c
+++ b/sysdeps/libm-ieee754/k_standard.c
@@ -845,12 +845,13 @@ static double zero = 0.0; /* used as const */
exc.type = SING;
exc.name = type < 100 ? "gamma" : (type < 200
? "gammaf" : "gammal");
- exc.retval = HUGE_VAL;
+ exc.retval = NAN;
if (_LIB_VERSION == _POSIX_)
__set_errno (EDOM);
else if (!matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("gamma: SING error\n", 18);
+ exc.retval = HUGE_VAL;
}
__set_errno (EDOM);
}
diff --git a/sysdeps/libm-ieee754/w_gamma.c b/sysdeps/libm-ieee754/w_gamma.c
index 02a3d47669..3511b67d77 100644
--- a/sysdeps/libm-ieee754/w_gamma.c
+++ b/sysdeps/libm-ieee754/w_gamma.c
@@ -32,7 +32,18 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
double y;
#ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_)
- y = __ieee754_lgamma_r(x,&signgam);
+ {
+ y = __ieee754_lgamma_r(x,&signgam);
+
+ if(!__finite(y)&&__finite(x)) {
+ if(__floor(x)==x&&x<=(double)0.0)
+ /* lgamma pole */
+ return __kernel_standard(x,x,15);
+ else
+ /* lgamma overflow */
+ return __kernel_standard(x,x,14);
+ }
+ }
else
{
#endif
@@ -43,14 +54,15 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
- }
- if(!__finite(y)&&__finite(x)) {
- if(__floor(x)==x&&x<=0.0)
+
+ if(!__finite(y)&&__finite(x)) {
+ if(__floor(x)==x&&x<=0.0)
return __kernel_standard(x,x,41); /* gamma pole */
- else
+ else
return __kernel_standard(x,x,40); /* gamma overflow */
- } else
- return y;
+ }
+ }
+ return y;
#endif
}
weak_alias (__gamma, gamma)
diff --git a/sysdeps/libm-ieee754/w_gammaf.c b/sysdeps/libm-ieee754/w_gammaf.c
index 7d78a52908..bc251b3554 100644
--- a/sysdeps/libm-ieee754/w_gammaf.c
+++ b/sysdeps/libm-ieee754/w_gammaf.c
@@ -30,7 +30,18 @@ static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
float y;
#ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_)
- y = __ieee754_lgammaf_r(x,&signgam);
+ {
+ y = __ieee754_lgammaf_r(x,&signgam);
+
+ if(!__finitef(y)&&__finitef(x)) {
+ if(__floorf(x)==x&&x<=(float)0.0)
+ /* lgammaf pole */
+ return (float)__kernel_standard((double)x,(double)x,115);
+ else
+ /* lgammaf overflow */
+ return (float)__kernel_standard((double)x,(double)x,114);
+ }
+ }
else
{
#endif
@@ -41,16 +52,17 @@ static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
+
+ if(!__finitef(y)&&__finitef(x)) {
+ if(__floorf(x)==x&&x<=(float)0.0)
+ /* gammaf pole */
+ return (float)__kernel_standard((double)x,(double)x,141);
+ else
+ /* gammaf overflow */
+ return (float)__kernel_standard((double)x,(double)x,140);
+ }
}
- if(!__finitef(y)&&__finitef(x)) {
- if(__floorf(x)==x&&x<=(float)0.0)
- /* gammaf pole */
- return (float)__kernel_standard((double)x,(double)x,141);
- else
- /* gammaf overflow */
- return (float)__kernel_standard((double)x,(double)x,140);
- } else
- return y;
+ return y;
#endif
}
weak_alias (__gammaf, gammaf)
diff --git a/sysdeps/libm-ieee754/w_gammal.c b/sysdeps/libm-ieee754/w_gammal.c
index 1b4ae2cc7b..68328f652a 100644
--- a/sysdeps/libm-ieee754/w_gammal.c
+++ b/sysdeps/libm-ieee754/w_gammal.c
@@ -35,7 +35,18 @@ static char rcsid[] = "$NetBSD: $";
long double y;
#ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_)
- y = __ieee754_lgammal_r(x,&signgam);
+ {
+ y = __ieee754_lgammal_r(x,&signgam);
+
+ if(!__finitel(y)&&__finitel(x)) {
+ if(__floorl(x)==x&&x<=(long double)0.0)
+ /* lgamma pole */
+ return (long double)__kernel_standard((double)x,(double)x,15);
+ else
+ /* lgamma overflow */
+ return (long double)__kernel_standard((double)x,(double)x,14);
+ }
+ }
else
{
#endif
@@ -46,14 +57,15 @@ static char rcsid[] = "$NetBSD: $";
return y;
#else
if(_LIB_VERSION == _IEEE_) return y;
- }
- if(!__finitel(y)&&__finitel(x)) {
- if(__floorl(x)==x&&x<=0.0)
+
+ if(!__finitel(y)&&__finitel(x)) {
+ if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,241); /* gamma pole */
- else
+ else
return __kernel_standard(x,x,240); /* gamma overflow */
- } else
- return y;
+ }
+ }
+ return y;
#endif
}
weak_alias (__gammal, gammal)