gonzui


Format: Advanced Search

t2ex/bsd_source/lib/libc/src_bsd/math/e_coshf.cbare sourcepermlink (0.02 seconds)

Search this content:

    1: /* e_coshf.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 "math.h"
   17: #include "math_private.h"
   18: 
   19: static const volatile float huge = 1.0e30;
   20: static const float one = 1.0, half=0.5;
   21: 
   22: float
   23: coshf(float x)
   24: {       
   25:         float t,w;
   26:         int32_t ix;
   27: 
   28:         GET_FLOAT_WORD(ix,x);
   29:         ix &= 0x7fffffff;
   30: 
   31:     /* x is INF or NaN */
   32:         if(ix>=0x7f800000) return x*x; 
   33: 
   34:     /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
   35:         if(ix<0x3eb17218) {
   36:             t = expm1f(fabsf(x));
   37:             w = one+t;
   38:             if (ix<0x24000000) return w;       /* cosh(tiny) = 1 */
   39:             return one+(t*t)/(w+w);
   40:         }
   41: 
   42:     /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
   43:         if (ix < 0x41b00000) {
   44:                 t = expf(fabsf(x));
   45:                 return half*t+half/t;
   46:         }
   47: 
   48:     /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
   49:         if (ix < 0x42b17180)  return half*expf(fabsf(x));
   50: 
   51:     /* |x| in [log(maxdouble), overflowthresold] */
   52:         if (ix<=0x42b2d4fc) {
   53:             w = expf(half*fabsf(x));
   54:             t = half*w;
   55:             return t*w;
   56:         }
   57: 
   58:     /* |x| > overflowthresold, cosh(x) overflow */
   59:         return huge*huge;
   60: }