aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/math/sinh.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/math/sinh.v')
-rw-r--r--v_windows/v/vlib/math/sinh.v49
1 files changed, 49 insertions, 0 deletions
diff --git a/v_windows/v/vlib/math/sinh.v b/v_windows/v/vlib/math/sinh.v
new file mode 100644
index 0000000..6bbf880
--- /dev/null
+++ b/v_windows/v/vlib/math/sinh.v
@@ -0,0 +1,49 @@
+module math
+
+// sinh calculates hyperbolic sine.
+pub fn sinh(x_ f64) f64 {
+ mut x := x_
+ // The coefficients are #2029 from Hart & Cheney. (20.36D)
+ 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
+ mut sign := false
+ if x < 0 {
+ x = -x
+ sign = true
+ }
+ mut temp := 0.0
+ if x > 21 {
+ temp = exp(x) * 0.5
+ } else if x > 0.5 {
+ ex := exp(x)
+ temp = (ex - 1.0 / ex) * 0.5
+ } else {
+ 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.
+//
+// special cases are:
+// cosh(±0) = 1
+// cosh(±inf) = +inf
+// cosh(nan) = nan
+pub fn cosh(x f64) f64 {
+ abs_x := abs(x)
+ if abs_x > 21 {
+ return exp(abs_x) * 0.5
+ }
+ ex := exp(abs_x)
+ return (ex + 1.0 / ex) * 0.5
+}