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 Colombiertanh(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