50 lines
1.0 KiB
V
50 lines
1.0 KiB
V
|
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
|
||
|
}
|