root/lib/math/ef_sqrt.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. sqrtf

   1 /* ef_sqrtf.c -- float version of e_sqrt.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 "fdlibm.h"
  17 
  18 #ifdef __STDC__
  19 static  const float     one     = 1.0, tiny=1.0e-30;
  20 #else
  21 static  float   one     = 1.0, tiny=1.0e-30;
  22 #endif
  23 
  24 float sqrtf(float x)
  25 {
  26         float z;
  27         int     sign = (int)0x80000000; 
  28         unsigned int r,hx;
  29         int ix,s,q,m,t,i;
  30 
  31         GET_FLOAT_WORD(ix,x);
  32         hx = ix&0x7fffffff;
  33 
  34     /* take care of Inf and NaN */
  35         if(!FLT_UWORD_IS_FINITE(hx))
  36             return x*x+x;               /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
  37                                            sqrt(-inf)=sNaN */
  38     /* take care of zero and -ves */
  39         if(FLT_UWORD_IS_ZERO(hx)) return x;/* sqrt(+-0) = +-0 */
  40         if(ix<0) return (x-x)/(x-x);            /* sqrt(-ve) = sNaN */
  41 
  42     /* normalize x */
  43         m = (ix>>23);
  44         if(FLT_UWORD_IS_SUBNORMAL(hx)) {                /* subnormal x */
  45             for(i=0;(ix&0x00800000L)==0;i++) ix<<=1;
  46             m -= i-1;
  47         }
  48         m -= 127;       /* unbias exponent */
  49         ix = (ix&0x007fffffL)|0x00800000L;
  50         if(m&1) /* odd m, double x to make it even */
  51             ix += ix;
  52         m >>= 1;        /* m = [m/2] */
  53 
  54     /* generate sqrt(x) bit by bit */
  55         ix += ix;
  56         q = s = 0;              /* q = sqrt(x) */
  57         r = 0x01000000L;                /* r = moving bit from right to left */
  58 
  59         while(r!=0) {
  60             t = s+r; 
  61             if(t<=ix) { 
  62                 s    = t+r; 
  63                 ix  -= t; 
  64                 q   += r; 
  65             } 
  66             ix += ix;
  67             r>>=1;
  68         }
  69 
  70     /* use floating add to find out rounding direction */
  71         if(ix!=0) {
  72             z = one-tiny; /* trigger inexact flag */
  73             if (z>=one) {
  74                 z = one+tiny;
  75                 if (z>one)
  76                     q += 2;
  77                 else
  78                     q += (q&1);
  79             }
  80         }
  81         ix = (q>>1)+0x3f000000L;
  82         ix += (m <<23);
  83         SET_FLOAT_WORD(z,ix);
  84         return z;
  85 }

/* [<][>][^][v][top][bottom][index][help] */