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

Go to the source code of this file.

Functions

double attribute_hidden __ieee754_log (double x)
 

Variables

static double ln2_hi = 6.93147180369123816490e-01
 
static double ln2_lo = 1.90821492927058770002e-10
 
static double two54 = 1.80143985094819840000e+16
 
static double Lg1 = 6.666666666666735130e-01
 
static double Lg2 = 3.999999999940941908e-01
 
static double Lg3 = 2.857142874366239149e-01
 
static double Lg4 = 2.222219843214978396e-01
 
static double Lg5 = 1.818357216161805012e-01
 
static double Lg6 = 1.531383769920937332e-01
 
static double Lg7 = 1.479819860511658591e-01
 
static double zero = 0.0
 

Function Documentation

double attribute_hidden __ieee754_log ( double  x)

Definition at line 99 of file e_log.c.

References EXTRACT_WORDS, GET_HIGH_WORD, i, j, Lg1, Lg2, Lg3, Lg4, Lg5, Lg6, Lg7, ln2_hi, ln2_lo, SET_HIGH_WORD, two54, and zero.

102 {
103  double hfsq, f, s, z, R, w, t1, t2, dk;
104  int32_t k, hx, i, j;
105  u_int32_t lx;
106 
107  EXTRACT_WORDS(hx, lx, x);
108 
109  k = 0;
110  if (hx < 0x00100000) { /* x < 2**-1022 */
111  if (((hx & 0x7fffffff) | lx) == 0)
112  return -two54 / zero; /* log(+-0)=-inf */
113  if (hx < 0)
114  return (x - x) / zero; /* log(-#) = NaN */
115  k -= 54;
116  x *= two54; /* subnormal number, scale up x */
117  GET_HIGH_WORD(hx, x);
118  }
119  if (hx >= 0x7ff00000)
120  return x + x;
121  k += (hx >> 20) - 1023;
122  hx &= 0x000fffff;
123  i = (hx + 0x95f64) & 0x100000;
124  SET_HIGH_WORD(x, hx | (i ^ 0x3ff00000)); /* normalize x or x/2 */
125  k += (i >> 20);
126  f = x - 1.0;
127  if ((0x000fffff & (2 + hx)) < 3) { /* |f| < 2**-20 */
128  if (f == zero) {
129  if (k == 0)
130  return zero;
131  else {
132  dk = (double) k;
133  return dk * ln2_hi + dk * ln2_lo;
134  }
135  }
136  R = f * f * (0.5 - 0.33333333333333333 * f);
137  if (k == 0)
138  return f - R;
139  else {
140  dk = (double) k;
141  return dk * ln2_hi - ((R - dk * ln2_lo) - f);
142  }
143  }
144  s = f / (2.0 + f);
145  dk = (double) k;
146  z = s * s;
147  i = hx - 0x6147a;
148  w = z * z;
149  j = 0x6b851 - hx;
150  t1 = w * (Lg2 + w * (Lg4 + w * Lg6));
151  t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));
152  i |= j;
153  R = t2 + t1;
154  if (i > 0) {
155  hfsq = 0.5 * f * f;
156  if (k == 0)
157  return f - (hfsq - s * (hfsq + R));
158  else
159  return dk * ln2_hi - ((hfsq - (s * (hfsq + R) + dk * ln2_lo)) -
160  f);
161  } else {
162  if (k == 0)
163  return f - s * (f - R);
164  else
165  return dk * ln2_hi - ((s * (f - R) - dk * ln2_lo) - f);
166  }
167 }
#define GET_HIGH_WORD(i, d)
Definition: math_private.h:103
static double zero
Definition: e_log.c:91
signed int int32_t
static double Lg1
Definition: e_log.c:80
static double ln2_lo
Definition: e_log.c:78
GLfloat f
static double Lg6
Definition: e_log.c:85
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1567
#define SET_HIGH_WORD(d, v)
Definition: math_private.h:131
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
GLdouble s
Definition: SDL_opengl.h:2056
unsigned int u_int32_t
Definition: math_private.h:29
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:93
static double Lg5
Definition: e_log.c:84
static double Lg4
Definition: e_log.c:83
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:42
static double Lg3
Definition: e_log.c:82
GLdouble GLdouble z
static double Lg7
Definition: e_log.c:86
static double two54
Definition: e_log.c:79
GLubyte GLubyte GLubyte GLubyte w
static double Lg2
Definition: e_log.c:81
static double ln2_hi
Definition: e_log.c:77
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 int in j)
Definition: SDL_x11sym.h:42

Variable Documentation

double Lg1 = 6.666666666666735130e-01
static

Definition at line 80 of file e_log.c.

Referenced by __ieee754_log().

double Lg2 = 3.999999999940941908e-01
static

Definition at line 81 of file e_log.c.

Referenced by __ieee754_log().

double Lg3 = 2.857142874366239149e-01
static

Definition at line 82 of file e_log.c.

Referenced by __ieee754_log().

double Lg4 = 2.222219843214978396e-01
static

Definition at line 83 of file e_log.c.

Referenced by __ieee754_log().

double Lg5 = 1.818357216161805012e-01
static

Definition at line 84 of file e_log.c.

Referenced by __ieee754_log().

double Lg6 = 1.531383769920937332e-01
static

Definition at line 85 of file e_log.c.

Referenced by __ieee754_log().

double Lg7 = 1.479819860511658591e-01
static

Definition at line 86 of file e_log.c.

Referenced by __ieee754_log().

double ln2_hi = 6.93147180369123816490e-01
static

Definition at line 77 of file e_log.c.

Referenced by __ieee754_log().

double ln2_lo = 1.90821492927058770002e-10
static

Definition at line 78 of file e_log.c.

Referenced by __ieee754_log().

double two54 = 1.80143985094819840000e+16
static

Definition at line 79 of file e_log.c.

Referenced by __ieee754_log(), and libm_hidden_proto().

double zero = 0.0
static

Definition at line 91 of file e_log.c.

Referenced by __ieee754_log().