gonzui


Format: Advanced Search

t2ex/bsd_source/lib/libc/src_bsd/math/e_log2f.cbare sourcepermlink (0.01 seconds)

Search this content:

    1: /* e_logf.c -- float version of e_log.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: ln2 = 0.6931471805599452862268, 
   21: two25 =    3.355443200e+07,     /* 0x4c000000 */
   22: Lg1 = 6.6666668653e-01, /* 3F2AAAAB */
   23: Lg2 = 4.0000000596e-01, /* 3ECCCCCD */
   24: Lg3 = 2.8571429849e-01, /* 3E924925 */
   25: Lg4 = 2.2222198546e-01, /* 3E638E29 */
   26: Lg5 = 1.8183572590e-01, /* 3E3A3325 */
   27: Lg6 = 1.5313838422e-01, /* 3E1CD04F */
   28: Lg7 = 1.4798198640e-01; /* 3E178897 */
   29: 
   30: static const float zero   =  0.0;
   31: 
   32: float
   33: log2f(float x)
   34: {
   35:         float hfsq,f,s,z,R,w,t1,t2,dk;
   36:         int32_t k,ix,i,j;
   37: 
   38:         GET_FLOAT_WORD(ix,x);
   39: 
   40:         k=0;
   41:         if (ix < 0x00800000) {                 /* x < 2**-126  */
   42:             if ((ix&0x7fffffff)==0)
   43:                 return -two25/zero;           /* log(+-0)=-inf */
   44:             if (ix<0) return (x-x)/zero;       /* log(-#) = NaN */
   45:             k -= 25; x *= two25; /* subnormal number, scale up x */
   46:             GET_FLOAT_WORD(ix,x);
   47:         }
   48:         if (ix >= 0x7f800000) return x+x;
   49:         k += (ix>>23)-127;
   50:         ix &= 0x007fffff;
   51:         i = (ix+(0x95f64<<3))&0x800000;
   52:         SET_FLOAT_WORD(x,ix|(i^0x3f800000));   /* normalize x or x/2 */
   53:         k += (i>>23);
   54:         dk = (float)k;
   55:         f = x-(float)1.0;
   56:         if((0x007fffff&(15+ix))<16) {  /* |f| < 2**-20 */
   57:             if (f==zero) 
   58:                     return (dk);
   59:             R = f*f*((float)0.5-(float)0.33333333333333333*f);
   60:             return (dk-(R-f)/ln2);
   61:         }
   62:         s = f/((float)2.0+f);
   63:         z = s*s;
   64:         i = ix-(0x6147a<<3);
   65:         w = z*z;
   66:         j = (0x6b851<<3)-ix;
   67:         t1= w*(Lg2+w*(Lg4+w*Lg6));
   68:         t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
   69:         i |= j;
   70:         R = t2+t1;
   71:         if(i>0) {
   72:             hfsq=(float)0.5*f*f;
   73:             return (dk-(hfsq-s*(hfsq+R)-f)/ln2);
   74:         } else
   75:                 return (dk-((s*(f-R))-f)/ln2);
   76: }