gonzui


Format: Advanced Search

t2ex/bsd_source/lib/libc/src_bsd/math/s_modff.cbare sourcepermlink (0.00 seconds)

Search this content:

    1: /* s_modff.c -- float version of s_modf.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 one = 1.0;
   20: 
   21: float
   22: modff(float x, float *iptr)
   23: {
   24:         int32_t i0,jj0;
   25:         u_int32_t i;
   26:         GET_FLOAT_WORD(i0,x);
   27:         jj0 = ((i0>>23)&0xff)-0x7f;    /* exponent of x */
   28:         if(jj0<23) {                   /* integer part in x */
   29:             if(jj0<0) {                        /* |x|<1 */
   30:                 SET_FLOAT_WORD(*iptr,i0&0x80000000);   /* *iptr = +-0 */
   31:                 return x;
   32:             } else {
   33:                 i = (0x007fffff)>>jj0;
   34:                 if((i0&i)==0) {                       /* x is integral */
   35:                     u_int32_t ix;
   36:                     *iptr = x;
   37:                     GET_FLOAT_WORD(ix,x);
   38:                     SET_FLOAT_WORD(x,ix&0x80000000);  /* return +-0 */
   39:                     return x;
   40:                 } else {
   41:                     SET_FLOAT_WORD(*iptr,i0&(~i));
   42:                     return x - *iptr;
   43:                 }
   44:             }
   45:         } else {                       /* no fraction part */
   46:             u_int32_t ix;
   47:             *iptr = x*one;
   48:             GET_FLOAT_WORD(ix,x);
   49:             SET_FLOAT_WORD(x,ix&0x80000000);   /* return +-0 */
   50:             return x;
   51:         }
   52: }