diff options
Diffstat (limited to 'src/pkg/math/sinh.go')
-rw-r--r-- | src/pkg/math/sinh.go | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/pkg/math/sinh.go b/src/pkg/math/sinh.go new file mode 100644 index 000000000..ef70989fb --- /dev/null +++ b/src/pkg/math/sinh.go @@ -0,0 +1,70 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package math + +import "math" + +/* + * Sinh(x) returns the hyperbolic sine of x + * + * The exponential func is called for arguments + * greater in magnitude than 0.5. + * + * A series is used for arguments smaller in magnitude than 0.5. + * + * Cosh(x) is computed from the exponential func for + * all arguments. + */ + +// Sinh returns the hyperbolic sine of x. +func Sinh(x float64) float64 { + // The coefficients are #2029 from Hart & Cheney. (20.36D) + const + ( + P0 = -0.6307673640497716991184787251e+6; + P1 = -0.8991272022039509355398013511e+5; + P2 = -0.2894211355989563807284660366e+4; + P3 = -0.2630563213397497062819489e+2; + Q0 = -0.6307673640497716991212077277e+6; + Q1 = 0.1521517378790019070696485176e+5; + Q2 = -0.173678953558233699533450911e+3; + ) + + sign := false; + if x < 0 { + x = -x; + sign = true; + } + + var temp float64; + switch true { + case x > 21: + temp = Exp(x)/2; + + case x > 0.5: + temp = (Exp(x) - Exp(-x))/2; + + default: + sq := x*x; + temp = (((P3*sq+P2)*sq+P1)*sq+P0)*x; + temp = temp/(((sq+Q2)*sq+Q1)*sq+Q0); + } + + if sign { + temp = -temp; + } + return temp; +} + +// Cosh returns the hyperbolic cosine of x. +func Cosh(x float64) float64 { + if x < 0 { + x = - x; + } + if x > 21 { + return Exp(x)/2; + } + return (Exp(x) + Exp(-x))/2; +} |