Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* ef_cosh.c -- float version of e_cosh.c.
  2.  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
  3.  */
  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.  
  16. #include "fdlibm.h"
  17.  
  18. #ifdef __v810__
  19. #define const
  20. #endif
  21.  
  22. #ifdef __STDC__
  23. static const float one = 1.0, half=0.5, huge = 1.0e30;
  24. #else
  25. static float one = 1.0, half=0.5, huge = 1.0e30;
  26. #endif
  27.  
  28. #ifdef __STDC__
  29.         float __ieee754_coshf(float x)
  30. #else
  31.         float __ieee754_coshf(x)
  32.         float x;
  33. #endif
  34. {      
  35.         float t,w;
  36.         __int32_t ix;
  37.  
  38.         GET_FLOAT_WORD(ix,x);
  39.         ix &= 0x7fffffff;
  40.  
  41.     /* x is INF or NaN */
  42.         if(!FLT_UWORD_IS_FINITE(ix)) return x*x;       
  43.  
  44.     /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
  45.         if(ix<0x3eb17218) {
  46.             t = expm1f(fabsf(x));
  47.             w = one+t;
  48.             if (ix<0x24000000) return w;        /* cosh(tiny) = 1 */
  49.             return one+(t*t)/(w+w);
  50.         }
  51.  
  52.     /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
  53.         if (ix < 0x41b00000) {
  54.                 t = __ieee754_expf(fabsf(x));
  55.                 return half*t+half/t;
  56.         }
  57.  
  58.     /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
  59.         if (ix <= FLT_UWORD_LOG_MAX)
  60.           return half*__ieee754_expf(fabsf(x));
  61.  
  62.     /* |x| in [log(maxdouble), overflowthresold] */
  63.         if (ix <= FLT_UWORD_LOG_2MAX) {
  64.             w = __ieee754_expf(half*fabsf(x));
  65.             t = half*w;
  66.             return t*w;
  67.         }
  68.  
  69.     /* |x| > overflowthresold, cosh(x) overflow */
  70.         return huge*huge;
  71. }
  72.