diff options
Diffstat (limited to 'libgo/go/math/gamma.go')
-rw-r--r-- | libgo/go/math/gamma.go | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/libgo/go/math/gamma.go b/libgo/go/math/gamma.go index 7c6f421bad1..164f54f332b 100644 --- a/libgo/go/math/gamma.go +++ b/libgo/go/math/gamma.go @@ -110,19 +110,26 @@ func stirling(x float64) float64 { return y } -// Gamma(x) returns the Gamma function of x. +// Gamma 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 +} |