1
0
mirror of https://github.com/golang/go synced 2024-11-20 02:24:43 -07:00

math: update Gamma special cases

Match new C99 values for special cases.

Fixes #2977.

R=rsc, golang-dev
CC=golang-dev
https://golang.org/cl/5972058
This commit is contained in:
Charles L. Dorian 2012-04-04 09:45:22 -04:00 committed by Russ Cox
parent 86092b3d45
commit 5496e94187
2 changed files with 22 additions and 7 deletions

View File

@ -1128,11 +1128,11 @@ var vfgammaSC = []float64{
NaN(),
}
var gammaSC = []float64{
NaN(),
NaN(),
Inf(-1),
Inf(1),
Inf(1),
Inf(1),
Inf(1),
NaN(),
}

View File

@ -113,16 +113,23 @@ func stirling(x float64) float64 {
// Gamma(x) returns the Gamma function of x.
//
// Special cases are:
// Gamma(±Inf) = ±Inf
// Gamma(+Inf) = +Inf
// Gamma(+0) = +Inf
// Gamma(-0) = -Inf
// Gamma(x) = NaN for integer x < 0
// Gamma(-Inf) = NaN
// Gamma(NaN) = NaN
// Large values overflow to +Inf.
// Zero and negative integer arguments return ±Inf.
func Gamma(x float64) float64 {
const Euler = 0.57721566490153286060651209008240243104215933593992 // A001620
// special cases
switch {
case IsInf(x, -1) || IsNaN(x):
return x
case isNegInt(x) || IsInf(x, -1) || IsNaN(x):
return NaN()
case x == 0:
if Signbit(x) {
return Inf(-1)
}
return Inf(1)
case x < -170.5674972726612 || x > 171.61447887182298:
return Inf(1)
}
@ -185,3 +192,11 @@ small:
}
return z / ((1 + Euler*x) * x)
}
func isNegInt(x float64) bool {
if x < 0 {
_, xf := Modf(x)
return xf == 0
}
return false
}