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.

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 }

References EXTRACT_WORDS, i, INSERT_WORDS, one, and tiny.

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().

t1
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
Definition: SDL_opengl_glext.h:8586
q
GLdouble GLdouble GLdouble GLdouble q
Definition: SDL_opengl.h:2087
r
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
z
GLdouble GLdouble z
Definition: SDL_opengl_glext.h:407
tiny
static const double tiny
Definition: e_sqrt.c:85
EXTRACT_WORDS
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:99
s1
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat s1
Definition: SDL_opengl_glext.h:8586
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
s0
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat s0
Definition: SDL_opengl_glext.h:8586
one
static const double one
Definition: e_sqrt.c:85
int32_t
signed int int32_t
Definition: SDL_config_windows.h:62
u_int32_t
unsigned int u_int32_t
Definition: math_private.h:31
t
GLdouble GLdouble t
Definition: SDL_opengl.h:2071
INSERT_WORDS
#define INSERT_WORDS(d, ix0, ix1)
Definition: math_private.h:127
m
const GLfloat * m
Definition: SDL_opengl_glext.h:6095
i
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