SDL  2.0
e_sqrt.c File Reference
#include "math_libm.h"
#include "math_private.h"
+ Include dependency graph for e_sqrt.c:

Go to the source code of this file.

Functions

double attribute_hidden __ieee754_sqrt (double x)
 

Variables

static const double one = 1.0
 
static const double tiny = 1.0e-300
 

Function Documentation

◆ __ieee754_sqrt()

double attribute_hidden __ieee754_sqrt ( double  x)

Definition at line 87 of file e_sqrt.c.

References __ieee754_sqrt(), EXTRACT_WORDS, i, INSERT_WORDS, libm_hidden_def(), one, strong_alias, and tiny.

Referenced by __ieee754_sqrt().

88 {
89  double z;
90  int32_t sign = (int)0x80000000;
91  int32_t ix0,s0,q,m,t,i;
92  u_int32_t r,t1,s1,ix1,q1;
93 
94  EXTRACT_WORDS(ix0,ix1,x);
95 
96  /* take care of Inf and NaN */
97  if((ix0&0x7ff00000)==0x7ff00000) {
98  return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
99  sqrt(-inf)=sNaN */
100  }
101  /* take care of zero */
102  if(ix0<=0) {
103  if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */
104  else if(ix0<0)
105  return (x-x)/(x-x); /* sqrt(-ve) = sNaN */
106  }
107  /* normalize x */
108  m = (ix0>>20);
109  if(m==0) { /* subnormal x */
110  while(ix0==0) {
111  m -= 21;
112  ix0 |= (ix1>>11); ix1 <<= 21;
113  }
114  for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1;
115  m -= i-1;
116  ix0 |= (ix1>>(32-i));
117  ix1 <<= i;
118  }
119  m -= 1023; /* unbias exponent */
120  ix0 = (ix0&0x000fffff)|0x00100000;
121  if(m&1){ /* odd m, double x to make it even */
122  ix0 += ix0 + ((ix1&sign)>>31);
123  ix1 += ix1;
124  }
125  m >>= 1; /* m = [m/2] */
126 
127  /* generate sqrt(x) bit by bit */
128  ix0 += ix0 + ((ix1&sign)>>31);
129  ix1 += ix1;
130  q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */
131  r = 0x00200000; /* r = moving bit from right to left */
132 
133  while(r!=0) {
134  t = s0+r;
135  if(t<=ix0) {
136  s0 = t+r;
137  ix0 -= t;
138  q += r;
139  }
140  ix0 += ix0 + ((ix1&sign)>>31);
141  ix1 += ix1;
142  r>>=1;
143  }
144 
145  r = sign;
146  while(r!=0) {
147  t1 = s1+r;
148  t = s0;
149  if((t<ix0)||((t==ix0)&&(t1<=ix1))) {
150  s1 = t1+r;
151  if(((t1&sign)==sign)&&(s1&sign)==0) s0 += 1;
152  ix0 -= t;
153  if (ix1 < t1) ix0 -= 1;
154  ix1 -= t1;
155  q1 += r;
156  }
157  ix0 += ix0 + ((ix1&sign)>>31);
158  ix1 += ix1;
159  r>>=1;
160  }
161 
162  /* use floating add to find out rounding direction */
163  if((ix0|ix1)!=0) {
164  z = one-tiny; /* trigger inexact flag */
165  if (z>=one) {
166  z = one+tiny;
167  if (q1==(u_int32_t)0xffffffff) { q1=0; q += 1;}
168  else if (z>one) {
169  if (q1==(u_int32_t)0xfffffffe) q+=1;
170  q1+=2;
171  } else
172  q1 += (q1&1);
173  }
174  }
175  ix0 = (q>>1)+0x3fe00000;
176  ix1 = q1>>1;
177  if ((q&1)==1) ix1 |= sign;
178  ix0 += (m <<20);
179  INSERT_WORDS(z,ix0,ix1);
180  return z;
181 }
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
GLdouble GLdouble z
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
signed int int32_t
GLdouble GLdouble GLdouble GLdouble q
Definition: SDL_opengl.h:2087
static const double tiny
Definition: e_sqrt.c:85
const GLfloat * m
static const double one
Definition: e_sqrt.c:85
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
unsigned int u_int32_t
Definition: math_private.h:31
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:98
#define INSERT_WORDS(d, ix0, ix1)
Definition: math_private.h:126
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat s1
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat s0
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
GLdouble GLdouble t
Definition: SDL_opengl.h:2071

Variable Documentation

◆ one

const double one = 1.0
static

Definition at line 85 of file e_sqrt.c.

Referenced by __ieee754_sqrt().

◆ tiny

const double tiny = 1.0e-300
static

Definition at line 85 of file e_sqrt.c.

Referenced by __ieee754_sqrt().