v
Зеркало из https://github.com/vlang/v
1module math
2
3const tanh_p = [
4-9.64399179425052238628e-1,
5-9.92877231001918586564e+1,
6-1.61468768441708447952e+3,
7]
8const tanh_q = [
91.12811678491632931402e+2,
102.23548839060100448583e+3,
114.84406305325125486048e+3,
12]
13
14// tanh returns the hyperbolic tangent of x.
15//
16// special cases are:
17// tanh(±0) = ±0
18// tanh(±inf) = ±1
19// tanh(nan) = nan
20pub fn tanh(x f64) f64 {
21maxlog := 8.8029691931113054295988e+01 // log(2**127)
22mut z := abs(x)
23if z > 0.5 * maxlog {
24if x < 0 {
25return f64(-1)
26}
27return 1.0
28} else if z >= 0.625 {
29s := exp(2.0 * z)
30z = 1.0 - 2.0 / (s + 1.0)
31if x < 0 {
32z = -z
33}
34} else {
35if x == 0 {
36return x
37}
38s := x * x
39z = x + x * s * ((tanh_p[0] * s + tanh_p[1]) * s + tanh_p[2]) / (((s + tanh_q[0]) * s +
40tanh_q[1]) * s + tanh_q[2])
41}
42return z
43}
44