• Russ Cox's avatar
    math: fix Gamma(x) for x < -170.5 and other corner cases · a39920fd
    Russ Cox authored
    Fixes #11441.
    
    Test tables generated by
    
    	package main
    
    	import (
    		"bytes"
    		"fmt"
    		"log"
    		"os/exec"
    		"strconv"
    		"strings"
    	)
    
    	var inputs = []float64{
    		0.5,
    		1.5,
    		2.5,
    		3.5,
    		-0.5,
    		-1.5,
    		-2.5,
    		-3.5,
    		0.1,
    		0.01,
    		1e-8,
    		1e-16,
    		1e-3,
    		1e-16,
    		1e-308,
    		5.6e-309,
    		5.5e-309,
    		1e-309,
    		1e-323,
    		5e-324,
    		-0.1,
    		-0.01,
    		-1e-8,
    		-1e-16,
    		-1e-3,
    		-1e-16,
    		-1e-308,
    		-5.6e-309,
    		-5.5e-309,
    		-1e-300 / 1e9,
    		-1e-300 / 1e23,
    		-5e-300 / 1e24,
    		-0.9999999999999999,
    		-1.0000000000000002,
    		-1.9999999999999998,
    		-2.0000000000000004,
    		-100.00000000000001,
    		-99.999999999999986,
    		17,
    		171,
    		171.6,
    		171.624,
    		171.625,
    		172,
    		2000,
    		-100.5,
    		-160.5,
    		-170.5,
    		-171.5,
    		-176.5,
    		-177.5,
    		-178.5,
    		-179.5,
    		-201.0001,
    		-202.9999,
    		-1000.5,
    		-1000000000.3,
    		-4503599627370495.5,
    		-63.349078729022985,
    		-127.45117632943295,
    	}
    
    	func main() {
    		var buf bytes.Buffer
    		for _, v := range inputs {
    			fmt.Fprintf(&buf, "gamma(%.1000g)\n", v)
    		}
    		cmd := exec.Command("gp", "-q")
    		cmd.Stdin = &buf
    		out, err := cmd.CombinedOutput()
    		if err != nil {
    			log.Fatalf("gp: %v", err)
    		}
    		f := strings.Split(string(out), "\n")
    		if len(f) > 0 && f[len(f)-1] == "" {
    			f = f[:len(f)-1]
    		}
    		if len(f) != len(inputs) {
    			log.Fatalf("gp: wrong output count\n%s\n", out)
    		}
    		for i, g := range f {
    			gf, err := strconv.ParseFloat(strings.Replace(g, " E", "e", -1), 64)
    			if err != nil {
    				if strings.Contains(err.Error(), "value out of range") {
    					if strings.HasPrefix(g, "-") {
    						fmt.Printf("\t{%g, Inf(-1)},\n", inputs[i])
    					} else {
    						fmt.Printf("\t{%g, Inf(1)},\n", inputs[i])
    					}
    					continue
    				}
    				log.Fatal(err)
    			}
    			if gf == 0 && strings.HasPrefix(g, "-") {
    				fmt.Printf("\t{%g, Copysign(0, -1)},\n", inputs[i])
    				continue
    			}
    			fmt.Printf("\t{%g, %g},\n", inputs[i], gf)
    		}
    	}
    
    Change-Id: Ie98c7751d92b8ffb40e8313f5ea10df0890e2feb
    Reviewed-on: https://go-review.googlesource.com/30146
    Run-TryBot: Russ Cox <rsc@golang.org>
    Reviewed-by: 's avatarQuentin Smith <quentin@golang.org>
    a39920fd
Name
Last commit
Last update
..
big Loading commit data...
cmplx Loading commit data...
rand Loading commit data...
abs.go Loading commit data...
acosh.go Loading commit data...
all_test.go Loading commit data...
asin.go Loading commit data...
asin_386.s Loading commit data...
asin_amd64.s Loading commit data...
asin_amd64p32.s Loading commit data...
asin_arm.s Loading commit data...
asinh.go Loading commit data...
atan.go Loading commit data...
atan2.go Loading commit data...
atan2_386.s Loading commit data...
atan2_amd64.s Loading commit data...
atan2_amd64p32.s Loading commit data...
atan2_arm.s Loading commit data...
atan_386.s Loading commit data...
atan_amd64.s Loading commit data...
atan_amd64p32.s Loading commit data...
atan_arm.s Loading commit data...
atanh.go Loading commit data...
bits.go Loading commit data...
cbrt.go Loading commit data...
const.go Loading commit data...
copysign.go Loading commit data...
dim.go Loading commit data...
dim_386.s Loading commit data...
dim_amd64.s Loading commit data...
dim_amd64p32.s Loading commit data...
dim_arm.s Loading commit data...
dim_arm64.s Loading commit data...
dim_s390x.s Loading commit data...
erf.go Loading commit data...
exp.go Loading commit data...
exp2_386.s Loading commit data...
exp2_amd64.s Loading commit data...
exp2_amd64p32.s Loading commit data...
exp2_arm.s Loading commit data...
exp_386.s Loading commit data...
exp_amd64.s Loading commit data...
exp_amd64p32.s Loading commit data...
exp_arm.s Loading commit data...
expm1.go Loading commit data...
expm1_386.s Loading commit data...
expm1_amd64.s Loading commit data...
expm1_amd64p32.s Loading commit data...
expm1_arm.s Loading commit data...
export_test.go Loading commit data...
floor.go Loading commit data...
floor_386.s Loading commit data...
floor_amd64.s Loading commit data...
floor_amd64p32.s Loading commit data...
floor_arm.s Loading commit data...
floor_arm64.s Loading commit data...
floor_asm.go Loading commit data...
floor_ppc64x.s Loading commit data...
floor_s390x.s Loading commit data...
frexp.go Loading commit data...
frexp_386.s Loading commit data...
frexp_amd64.s Loading commit data...
frexp_amd64p32.s Loading commit data...
frexp_arm.s Loading commit data...
gamma.go Loading commit data...
hypot.go Loading commit data...
hypot_386.s Loading commit data...
hypot_amd64.s Loading commit data...
hypot_amd64p32.s Loading commit data...
hypot_arm.s Loading commit data...
j0.go Loading commit data...
j1.go Loading commit data...
jn.go Loading commit data...
ldexp.go Loading commit data...
ldexp_386.s Loading commit data...
ldexp_amd64.s Loading commit data...
ldexp_amd64p32.s Loading commit data...
ldexp_arm.s Loading commit data...
lgamma.go Loading commit data...
log.go Loading commit data...
log10.go Loading commit data...
log10_386.s Loading commit data...
log10_amd64.s Loading commit data...
log10_amd64p32.s Loading commit data...
log10_arm.s Loading commit data...
log1p.go Loading commit data...
log1p_386.s Loading commit data...
log1p_amd64.s Loading commit data...
log1p_amd64p32.s Loading commit data...
log1p_arm.s Loading commit data...
log_386.s Loading commit data...
log_amd64.s Loading commit data...
log_amd64p32.s Loading commit data...
log_arm.s Loading commit data...
logb.go Loading commit data...
mod.go Loading commit data...
mod_386.s Loading commit data...
mod_amd64.s Loading commit data...
mod_amd64p32.s Loading commit data...
mod_arm.s Loading commit data...
modf.go Loading commit data...
modf_386.s Loading commit data...
modf_amd64.s Loading commit data...
modf_amd64p32.s Loading commit data...
modf_arm.s Loading commit data...
modf_arm64.s Loading commit data...
nextafter.go Loading commit data...
pow.go Loading commit data...
pow10.go Loading commit data...
remainder.go Loading commit data...
remainder_386.s Loading commit data...
remainder_amd64.s Loading commit data...
remainder_amd64p32.s Loading commit data...
remainder_arm.s Loading commit data...
signbit.go Loading commit data...
sin.go Loading commit data...
sin_386.s Loading commit data...
sin_amd64.s Loading commit data...
sin_amd64p32.s Loading commit data...
sin_arm.s Loading commit data...
sincos.go Loading commit data...
sincos_386.s Loading commit data...
sincos_amd64.s Loading commit data...
sincos_amd64p32.s Loading commit data...
sincos_arm.s Loading commit data...
sinh.go Loading commit data...
sqrt.go Loading commit data...
sqrt_386.s Loading commit data...
sqrt_amd64.s Loading commit data...
sqrt_amd64p32.s Loading commit data...
sqrt_arm.s Loading commit data...
sqrt_arm64.s Loading commit data...
sqrt_ppc64x.s Loading commit data...
sqrt_s390x.s Loading commit data...
stubs_arm64.s Loading commit data...
stubs_mips64x.s Loading commit data...
stubs_ppc64x.s Loading commit data...
stubs_s390x.s Loading commit data...
tan.go Loading commit data...
tan_386.s Loading commit data...
tan_amd64.s Loading commit data...
tan_amd64p32.s Loading commit data...
tan_arm.s Loading commit data...
tanh.go Loading commit data...
unsafe.go Loading commit data...