[BACK]Return to s_scalbnf.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libm / src

Annotation of src/lib/libm/src/s_scalbnf.c, Revision 1.1

1.1     ! jtc         1: /* s_scalbnf.c -- float version of s_scalbn.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: #ifndef lint
        !            17: static char rcsid[] = "$Id: $";
        !            18: #endif
        !            19:
        !            20: #include "math.h"
        !            21: #include "math_private.h"
        !            22:
        !            23: #ifdef __STDC__
        !            24: static const float
        !            25: #else
        !            26: static float
        !            27: #endif
        !            28: two25   =  3.355443200e+07,    /* 0x4c000000 */
        !            29: twom25  =  2.9802322388e-08,   /* 0x33000000 */
        !            30: huge   = 1.0e+30,
        !            31: tiny   = 1.0e-30;
        !            32:
        !            33: #ifdef __STDC__
        !            34:        float scalbnf (float x, int n)
        !            35: #else
        !            36:        float scalbn (x,n)
        !            37:        float x; int n;
        !            38: #endif
        !            39: {
        !            40:        int  k,ix;
        !            41:        GET_FLOAT_WORD(ix,x);
        !            42:         k = (ix&0x7f800000)>>23;               /* extract exponent */
        !            43:         if (k==0) {                            /* 0 or subnormal x */
        !            44:             if ((ix&0x7fffffff)==0) return x; /* +-0 */
        !            45:            x *= two25;
        !            46:            GET_FLOAT_WORD(ix,x);
        !            47:            k = ((ix&0x7f800000)>>23) - 25;
        !            48:             if (n< -50000) return tiny*x;      /*underflow*/
        !            49:            }
        !            50:         if (k==0xff) return x+x;               /* NaN or Inf */
        !            51:         k = k+n;
        !            52:         if (k >  0xfe) return huge*copysignf(huge,x); /* overflow  */
        !            53:         if (k > 0)                             /* normal result */
        !            54:            {SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;}
        !            55:         if (k <= -25)
        !            56:             if (n > 50000)     /* in case integer overflow in n+k */
        !            57:                return huge*copysignf(huge,x);  /*overflow*/
        !            58:            else return tiny*copysignf(tiny,x); /*underflow*/
        !            59:         k += 25;                               /* subnormal result */
        !            60:        SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23));
        !            61:         return x*twom25;
        !            62: }

CVSweb <webmaster@jp.NetBSD.org>