gonzui


Format: Advanced Search

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

Search this content:

    1: /* s_rintf.c -- float version of s_rint.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: TWO23[2]={
   21:   8.3886080000e+06, /* 0x4b000000 */
   22:  -8.3886080000e+06, /* 0xcb000000 */
   23: };
   24: 
   25: float
   26: rintf(float x)
   27: {
   28:         int32_t i0,jj0,sx;
   29:         u_int32_t i,i1;
   30:         float t;
   31:         volatile float w;      /* clip extra precision */
   32:         GET_FLOAT_WORD(i0,x);
   33:         sx = (i0>>31)&1;
   34:         jj0 = ((i0>>23)&0xff)-0x7f;
   35:         if(jj0<23) {
   36:             if(jj0<0) {        
   37:                 if((i0&0x7fffffff)==0) return x;
   38:                 i1 = (i0&0x07fffff);
   39:                 i0 &= 0xfff00000;
   40:                 i0 |= ((i1|-i1)>>9)&0x400000;
   41:                 SET_FLOAT_WORD(x,i0);
   42:                 w = TWO23[sx]+x;
   43:                 t =  w-TWO23[sx];
   44:                 GET_FLOAT_WORD(i0,t);
   45:                 SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
   46:                 return t;
   47:             } else {
   48:                 i = (0x007fffff)>>jj0;
   49:                 if((i0&i)==0) return x; /* x is integral */
   50:                 i>>=1;
   51:                 if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>jj0);
   52:             }
   53:         } else {
   54:             if(jj0==0x80) return x+x;  /* inf or NaN */
   55:             else return x;             /* x is integral */
   56:         }
   57:         SET_FLOAT_WORD(x,i0);
   58:         w = TWO23[sx]+x;
   59:         return w-TWO23[sx];
   60: }