Commit 5496e941 authored by Charles L. Dorian's avatar Charles L. Dorian Committed by Russ Cox

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
parent 86092b3d
......@@ -1128,11 +1128,11 @@ var vfgammaSC = []float64{
NaN(),
}
var gammaSC = []float64{
NaN(),
NaN(),
Inf(-1),
Inf(1),
Inf(1),
Inf(1),
Inf(1),
NaN(),
}
......
......@@ -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
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment