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

VxWorks

开发平台:

C/C++

  1. /* atanh.c - math routines */
  2. /* Copyright 1992 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01c,14oct92,jdi  made atanh() nomanual.
  7. 01b,20sep92,smb  documentation additions
  8. 01a,08jul92,smb  documentation.
  9. */
  10. /*
  11. DESCRIPTION
  12. * Copyright (c) 1985 Regents of the University of California.
  13. *  All rights reserved.
  14. *
  15. * Redistribution and use in source and binary forms are permitted
  16. * provided that the above copyright notice and this paragraph are
  17. * duplicated in all such forms and that any documentation,
  18. * advertising materials, and other materials related to such
  19. * distribution and use acknowledge that the software was developed
  20. * by the University of California, Berkeley.  The name of the
  21. * University may not be used to endorse or promote products derived
  22. * from this software without specific prior written permission.
  23. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  24. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  25. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  26. *
  27. * All recipients should regard themselves as participants in an ongoing
  28. * research project and hence should feel obligated to report their
  29. * experiences (good or bad) with these elementary function codes, using
  30. * the sendbug(8) program, to the authors.
  31. *
  32. SEE ALSO: American National Standard X3.159-1989
  33. NOMANUAL
  34. */
  35. #include "vxWorks.h"
  36. #include "math.h"
  37. #if defined(vax)||defined(tahoe)
  38. #include <errno.h>
  39. #endif /* defined(vax)||defined(tahoe) */
  40. /*****************************************************************************
  41. *
  42. * atanh -
  43. *
  44. * ATANH(X)
  45. * RETURN THE HYPERBOLIC ARC TANGENT OF X
  46. * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS)
  47. * CODED IN C BY K.C. NG, 1/8/85;
  48. * REVISED BY K.C. NG on 2/7/85, 3/7/85, 8/18/85.
  49. *
  50. * Required kernel function:
  51. * .CS
  52. * log1p(x)  ...return log(1+x)
  53. * .CE
  54. *
  55. * Method :
  56. * .CS
  57. * Return
  58. *                          1              2x                          x
  59. * atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------)
  60. *                          2             1 - x                      1 - x
  61. * .CE
  62. *
  63. * Special cases are if atanh(x) is NaN if |x| > 1 with signal; atanh(NaN) is 
  64. * that NaN with no signal; or if atanh(+-1) is +-INF with signal.
  65. *
  66. * atanh(x) returns the exact hyperbolic arc tangent of x nearly rounded.
  67. * In a test run with 512,000 random arguments on a VAX, the maximum
  68. * observed error was 1.87 ulps (units in the last place) at
  69. * x= -3.8962076028810414000e-03.
  70. *
  71. * NOMANUAL
  72. */
  73. double atanh(x)
  74. double x;
  75. {
  76. double copysign(),log1p(),z;
  77. z = copysign(0.5,x);
  78. x = copysign(x,1.0);
  79. #if defined(vax)||defined(tahoe)
  80. if (x == 1.0) {
  81.     extern double infnan();
  82.     return(copysign(1.0,z)*infnan(ERANGE)); /* sign(x)*INF */
  83. }
  84. #endif /* defined(vax)||defined(tahoe) */
  85. x = x/(1.0-x);
  86. return( z*log1p(x+x) );
  87. }