xref: /plan9/sys/src/libc/port/tanh.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <u.h>
2*3e12c5d1SDavid du Colombier #include <libc.h>
3*3e12c5d1SDavid du Colombier 
4*3e12c5d1SDavid du Colombier /*
5*3e12c5d1SDavid du Colombier 	tanh(arg) computes the hyperbolic tangent of its floating
6*3e12c5d1SDavid du Colombier 	point argument.
7*3e12c5d1SDavid du Colombier 
8*3e12c5d1SDavid du Colombier 	sinh and cosh are called except for large arguments, which
9*3e12c5d1SDavid du Colombier 	would cause overflow improperly.
10*3e12c5d1SDavid du Colombier  */
11*3e12c5d1SDavid du Colombier 
12*3e12c5d1SDavid du Colombier double
tanh(double arg)13*3e12c5d1SDavid du Colombier tanh(double arg)
14*3e12c5d1SDavid du Colombier {
15*3e12c5d1SDavid du Colombier 
16*3e12c5d1SDavid du Colombier 	if(arg < 0) {
17*3e12c5d1SDavid du Colombier 		arg = -arg;
18*3e12c5d1SDavid du Colombier 		if(arg > 21)
19*3e12c5d1SDavid du Colombier 			return -1;
20*3e12c5d1SDavid du Colombier 		return -sinh(arg)/cosh(arg);
21*3e12c5d1SDavid du Colombier 	}
22*3e12c5d1SDavid du Colombier 	if(arg > 21)
23*3e12c5d1SDavid du Colombier 		return 1;
24*3e12c5d1SDavid du Colombier 	return sinh(arg)/cosh(arg);
25*3e12c5d1SDavid du Colombier }
26