tanh.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:3k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* tanh.c - math routines */
  2. /* Copyright 1992-1994 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,09dec94,rhp  fix man pages for hyperbolic fns.
  7. 01e,05feb93,jdi  doc changes based on kdl review.
  8. 01d,02dec92,jdi  doc tweaks.
  9. 01c,28oct92,jdi  documentation cleanup.
  10. 01b,20sep92,smb  documentation additions
  11. 01a,08jul92,smb  documentation.
  12. */
  13. /*
  14. DESCRIPTION
  15. * Copyright (c) 1985 Regents of the University of California.
  16. * All rights reserved.
  17. *
  18. * Redistribution and use in source and binary forms are permitted
  19. * provided that the above copyright notice and this paragraph are
  20. * duplicated in all such forms and that any documentation,
  21. * advertising materials, and other materials related to such
  22. * distribution and use acknowledge that the software was developed
  23. * by the University of California, Berkeley.  The name of the
  24. * University may not be used to endorse or promote products derived
  25. * from this software without specific prior written permission.
  26. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  27. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  28. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  29. *
  30. * All recipients should regard themselves as participants in an ongoing
  31. * research project and hence should feel obligated to report their
  32. * experiences (good or bad) with these elementary function codes, using
  33. * the sendbug(8) program, to the authors.
  34. *
  35. SEE ALSO: American National Standard X3.159-1989
  36. NOMANUAL
  37. */
  38. #include "vxWorks.h"
  39. #include "math.h"
  40. /*******************************************************************************
  41. *
  42. * tanh - compute a hyperbolic tangent (ANSI)
  43. *
  44. * This routine returns the hyperbolic tangent of <x> in
  45. * double precision (IEEE double, 53 bits).
  46. *
  47. * INTERNAL:
  48. * Method:
  49. *
  50. * (1) Reduce <x> to non-negative by:
  51. *
  52. *         tanh(-x) = - tanh(x)
  53. *
  54. * (2)
  55. *         0      <  x <=  1.e-10 :  tanh(x) := x
  56. *
  57. *                                               -expm1(-2x)
  58. *         1.e-10 <  x <=  1      :  tanh(x) := --------------
  59. *                                              expm1(-2x) + 2
  60. *
  61. *                                                       2
  62. *         1      <= x <=  22.0   :  tanh(x) := 1 -  ---------------
  63. *                                                   expm1(2x) + 2
  64. *         22.0   <  x <= INF     :  tanh(x) := 1.
  65. *
  66. *     Note: 22 was chosen so that fl(1.0+2/(expm1(2*22)+2)) == 1.
  67. *
  68. * INCLUDE FILES: math.h
  69. *
  70. * RETURNS:
  71. * The double-precision hyperbolic tangent of <x>.
  72. *
  73. * Special cases:
  74. *     If <x> is NaN, tanh() returns NaN.
  75. *
  76. * SEE ALSO: mathALib
  77. *
  78. * INTERNAL:
  79. * Coded in C by K.C. Ng, 1/8/85;
  80. * Revised by K.C. Ng on 2/8/85, 2/11/85, 3/7/85, 3/24/85.
  81. */
  82. double tanh
  83.     (
  84.     double x /* number whose hyperbolic tangent is required */
  85.     )
  86.     {
  87. static double one=1.0, two=2.0, small = 1.0e-10, big = 1.0e10;
  88. double expm1(), t, copysign(), sign;
  89. int finite();
  90. #if !defined(vax)&&!defined(tahoe)
  91. if(x!=x) return(x); /* x is NaN */
  92. #endif /* !defined(vax)&&!defined(tahoe) */
  93. sign=copysign(one,x);
  94. x=copysign(x,one);
  95. if(x < 22.0)
  96.     if( x > one )
  97. return(copysign(one-two/(expm1(x+x)+two),sign));
  98.     else if ( x > small )
  99. {t= -expm1(-(x+x)); return(copysign(t/(two-t),sign));}
  100.     else /* raise the INEXACT flag for non-zero x */
  101. {big+x; return(copysign(x,sign));}
  102. else if(finite(x))
  103.     return (sign+1.0E-37); /* raise the INEXACT flag */
  104. else
  105.     return(sign); /* x is +- INF */
  106.     }