diff -r 000000000000 -r e4d67989cc36 genericopenlibs/cstdlib/LMATH/S_TANH.C --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cstdlib/LMATH/S_TANH.C Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,126 @@ +/* S_TANH.C + * + * Portions Copyright (c) 1993-1999 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + */ + + +/* @(#)s_tanh.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* + +FUNCTION + <>, <>---hyperbolic tangent + +INDEX +tanh +INDEX +tanhf + +ANSI_SYNOPSIS + #include + double tanh(double <[x]>); + float tanhf(float <[x]>); + +TRAD_SYNOPSIS + #include + double tanh(<[x]>) + double <[x]>; + + float tanhf(<[x]>) + float <[x]>; + + +DESCRIPTION + +<> computes the hyperbolic tangent of +the argument <[x]>. Angles are specified in radians. + +<)>> is defined as +. sinh(<[x]>)/cosh(<[x]>) + +<> is identical, save that it takes and returns <> values. + +RETURNS +The hyperbolic tangent of <[x]> is returned. + +PORTABILITY +<> is ANSI C. <> is an extension. + +*/ + +/* Tanh(x) + * Return the Hyperbolic Tangent of x + * + * Method : + * x -x + * e - e + * 0. tanh(x) is defined to be ----------- + * x -x + * e + e + * 1. reduce x to non-negative by tanh(-x) = -tanh(x). + * 2. 0 <= x <= 2**-55 : tanh(x) := x*(one+x) + * -t + * 2**-55 < x <= 1 : tanh(x) := -----; t = expm1(-2x) + * t + 2 + * 2 + * 1 <= x <= 22.0 : tanh(x) := 1- ----- ; t=expm1(2x) + * t + 2 + * 22.0 < x <= INF : tanh(x) := 1. + * + * Special cases: + * tanh(NaN) is NaN; + * only tanh(0)=0 is exact for finite argument. + */ + +#include "FDLIBM.H" + +static const double one=1.0, two=2.0, tiny = 1.0e-300; + +/** +Calculate hyperbolic tangent. +@return hyperbolic tangent of x. +@param x Angle expressed in radians (180 degrees = PI radians). +*/ +EXPORT_C double tanh(double x) __SOFTFP +{ + double t,z; + __int32_t jx,ix; + + /* High word of |x|. */ + GET_HIGH_WORD(jx,x); + ix = jx&0x7fffffff; + + /* x is INF or NaN */ + if(ix>=0x7ff00000) { + if (jx>=0) return one/x+one; /* tanh(+-inf)=+-1 */ + else return one/x-one; /* tanh(NaN) = NaN */ + } + + /* |x| < 22 */ + if (ix < 0x40360000) { /* |x|<22 */ + if (ix<0x3c800000) /* |x|<2**-55 */ + return x*(one+x); /* tanh(small) = small */ + if (ix>=0x3ff00000) { /* |x|>=1 */ + t = expm1(two*fabs(x)); + z = one - two/(t+two); + } else { + t = expm1(-two*fabs(x)); + z= -t/(t+two); + } + /* |x| > 22, return +-1 */ + } else { + z = one - tiny; /* raised inexact flag */ + } + return (jx>=0)? z: -z; +}