gonzui


Format: Advanced Search

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

Search this content:

    1: /* s_asinhf.c -- float version of s_asinh.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 float 
   20: one =  1.0000000000e+00, /* 0x3F800000 */
   21: ln2 =  6.9314718246e-01, /* 0x3f317218 */
   22: huge=  1.0000000000e+30; 
   23: 
   24: float
   25: asinhf(float x)
   26: {       
   27:         float t,w;
   28:         int32_t hx,ix;
   29:         GET_FLOAT_WORD(hx,x);
   30:         ix = hx&0x7fffffff;
   31:         if(ix>=0x7f800000) return x+x; /* x is inf or NaN */
   32:         if(ix< 0x31800000) {   /* |x|<2**-28 */
   33:             if(huge+x>one) return x;   /* return x inexact except 0 */
   34:         } 
   35:         if(ix>0x4d800000) {    /* |x| > 2**28 */
   36:             w = logf(fabsf(x))+ln2;
   37:         } else if (ix>0x40000000) {    /* 2**28 > |x| > 2.0 */
   38:             t = fabsf(x);
   39:             w = logf((float)2.0*t+one/(sqrtf(x*x+one)+t));
   40:         } else {               /* 2.0 > |x| > 2**-28 */
   41:             t = x*x;
   42:             w =log1pf(fabsf(x)+t/(one+sqrtf(one+t)));
   43:         }
   44:         if(hx>0) return w; else return -w;
   45: }