asinhf.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /* origin: FreeBSD /usr/src/lib/msun/src/s_asinhf.c */
  2. /*
  3. * Conversion to float by Ian Lance Taylor, Cygnus Support, [email protected].
  4. */
  5. /*
  6. * ====================================================
  7. * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
  8. *
  9. * Developed at SunPro, a Sun Microsystems, Inc. business.
  10. * Permission to use, copy, modify, and distribute this
  11. * software is freely granted, provided that this notice
  12. * is preserved.
  13. * ====================================================
  14. */
  15. #include "libm.h"
  16. static const float
  17. ln2 = 6.9314718246e-01, /* 0x3f317218 */
  18. huge= 1.0000000000e+30;
  19. float asinhf(float x)
  20. {
  21. float t,w;
  22. int32_t hx,ix;
  23. GET_FLOAT_WORD(hx, x);
  24. ix = hx & 0x7fffffff;
  25. if (ix >= 0x7f800000) /* x is inf or NaN */
  26. return x+x;
  27. if (ix < 0x31800000) { /* |x| < 2**-28 */
  28. /* return x inexact except 0 */
  29. if (huge+x > 1.0f)
  30. return x;
  31. }
  32. if (ix > 0x4d800000) { /* |x| > 2**28 */
  33. w = logf(fabsf(x)) + ln2;
  34. } else if (ix > 0x40000000) { /* 2**28 > |x| > 2.0 */
  35. t = fabsf(x);
  36. w = logf(2.0f*t + 1.0f/(sqrtf(x*x+1.0f)+t));
  37. } else { /* 2.0 > |x| > 2**-28 */
  38. t = x*x;
  39. w =log1pf(fabsf(x) + t/(1.0f+sqrtf(1.0f+t)));
  40. }
  41. if (hx > 0)
  42. return w;
  43. return -w;
  44. }