summaryrefslogtreecommitdiff
path: root/libgo/go/math/gamma.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/math/gamma.go')
-rw-r--r--libgo/go/math/gamma.go27
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
+}