summaryrefslogtreecommitdiff
path: root/src/pkg/math/sinh.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/math/sinh.go')
-rw-r--r--src/pkg/math/sinh.go70
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;
+}