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

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