78 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| /* @(#)z_tanhf.c 1.0 98/08/13 */
 | |
| /*****************************************************************
 | |
|  * The following routines are coded directly from the algorithms
 | |
|  * and coefficients given in "Software Manual for the Elementary
 | |
|  * Functions" by William J. Cody, Jr. and William Waite, Prentice
 | |
|  * Hall, 1980.
 | |
|  *****************************************************************/
 | |
| /******************************************************************
 | |
|  * Hyperbolic Tangent
 | |
|  *
 | |
|  * Input:
 | |
|  *   x - floating point value
 | |
|  *
 | |
|  * Output:
 | |
|  *   hyperbolic tangent of x
 | |
|  *
 | |
|  * Description:
 | |
|  *   This routine calculates hyperbolic tangent.
 | |
|  *
 | |
|  *****************************************************************/
 | |
| 
 | |
| #include <float.h>
 | |
| #include "fdlibm.h"
 | |
| #include "zmath.h"
 | |
| 
 | |
| static const float LN3_OVER2 = 0.5493061443;
 | |
| static const float p[] = { -0.2059432032,
 | |
|                            -0.0009577527 };
 | |
| static const float q[] = {  0.6178299136,
 | |
|                             0.25 };
 | |
| 
 | |
| float
 | |
| _DEFUN (tanhf, (float),
 | |
|         float x)
 | |
| {
 | |
|   float f, res, g, P, Q, R;
 | |
| 
 | |
|   f = fabsf (x);
 | |
| 
 | |
|   /* Check if the input is too big. */ 
 | |
|   if (f > BIGX)
 | |
|     res = 1.0; 
 | |
| 
 | |
|   else if (f > LN3_OVER2)
 | |
|     res = 1.0 - 2.0 / (exp (2 * f) + 1.0);
 | |
| 
 | |
|   /* Check if the input is too small. */
 | |
|   else if (f < z_rooteps_f)
 | |
|     res = f;
 | |
| 
 | |
|   /* Calculate the Taylor series. */
 | |
|   else
 | |
|     {
 | |
|       g = f * f;
 | |
| 
 | |
|       P = p[1] * g + p[0];
 | |
|       Q = (g + q[1]) * g + q[0];
 | |
|       R = g * (P / Q);
 | |
| 
 | |
|       res = f + f * R;
 | |
|     }
 | |
| 
 | |
|   if (x < 0.0)
 | |
|     res = -res;
 | |
| 
 | |
|   return (res);
 | |
| }
 | |
| 
 | |
| #ifdef _DOUBLE_IS_32BITS
 | |
| 
 | |
| double tanh (double x)
 | |
| {
 | |
|   return (double) tanhf ((float) x);
 | |
| }
 | |
| 
 | |
| #endif _DOUBLE_IS_32BITS
 |