46 lines
		
	
	
		
			846 B
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			846 B
		
	
	
	
		
			V
		
	
	
module math
 | 
						|
 | 
						|
const (
 | 
						|
	tanh_p = [
 | 
						|
		-9.64399179425052238628e-1,
 | 
						|
		-9.92877231001918586564e+1,
 | 
						|
		-1.61468768441708447952e+3,
 | 
						|
	]
 | 
						|
	tanh_q = [
 | 
						|
		1.12811678491632931402e+2,
 | 
						|
		2.23548839060100448583e+3,
 | 
						|
		4.84406305325125486048e+3,
 | 
						|
	]
 | 
						|
)
 | 
						|
 | 
						|
// tanh returns the hyperbolic tangent of x.
 | 
						|
//
 | 
						|
// special cases are:
 | 
						|
// tanh(±0) = ±0
 | 
						|
// tanh(±inf) = ±1
 | 
						|
// tanh(nan) = nan
 | 
						|
pub fn tanh(x f64) f64 {
 | 
						|
	maxlog := 8.8029691931113054295988e+01 // log(2**127)
 | 
						|
	mut z := abs(x)
 | 
						|
	if z > 0.5 * maxlog {
 | 
						|
		if x < 0 {
 | 
						|
			return f64(-1)
 | 
						|
		}
 | 
						|
		return 1.0
 | 
						|
	} else if z >= 0.625 {
 | 
						|
		s := exp(2.0 * z)
 | 
						|
		z = 1.0 - 2.0 / (s + 1.0)
 | 
						|
		if x < 0 {
 | 
						|
			z = -z
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		if x == 0 {
 | 
						|
			return x
 | 
						|
		}
 | 
						|
		s := x * x
 | 
						|
		z = x + x * s * ((math.tanh_p[0] * s + math.tanh_p[1]) * s + math.tanh_p[2]) / (((s +
 | 
						|
			math.tanh_q[0]) * s + math.tanh_q[1]) * s + math.tanh_q[2])
 | 
						|
	}
 | 
						|
	return z
 | 
						|
}
 |