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.

{
double hfsq, f, s, z, R, w, t1, t2, dk;
int32_t k, hx, i, j;
u_int32_t lx;
EXTRACT_WORDS(hx, lx, x);
k = 0;
if (hx < 0x00100000) { /* x < 2**-1022 */
if (((hx & 0x7fffffff) | lx) == 0)
return -two54 / zero; /* log(+-0)=-inf */
if (hx < 0)
return (x - x) / zero; /* log(-#) = NaN */
k -= 54;
x *= two54; /* subnormal number, scale up x */
GET_HIGH_WORD(hx, x);
}
if (hx >= 0x7ff00000)
return x + x;
k += (hx >> 20) - 1023;
hx &= 0x000fffff;
i = (hx + 0x95f64) & 0x100000;
SET_HIGH_WORD(x, hx | (i ^ 0x3ff00000)); /* normalize x or x/2 */
k += (i >> 20);
f = x - 1.0;
if ((0x000fffff & (2 + hx)) < 3) { /* |f| < 2**-20 */
if (f == zero) {
if (k == 0)
return zero;
else {
dk = (double) k;
return dk * ln2_hi + dk * ln2_lo;
}
}
R = f * f * (0.5 - 0.33333333333333333 * f);
if (k == 0)
return f - R;
else {
dk = (double) k;
return dk * ln2_hi - ((R - dk * ln2_lo) - f);
}
}
s = f / (2.0 + f);
dk = (double) k;
z = s * s;
i = hx - 0x6147a;
w = z * z;
j = 0x6b851 - hx;
t1 = w * (Lg2 + w * (Lg4 + w * Lg6));
t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));
i |= j;
R = t2 + t1;
if (i > 0) {
hfsq = 0.5 * f * f;
if (k == 0)
return f - (hfsq - s * (hfsq + R));
else
return dk * ln2_hi - ((hfsq - (s * (hfsq + R) + dk * ln2_lo)) -
f);
} else {
if (k == 0)
return f - s * (f - R);
else
return dk * ln2_hi - ((s * (f - R) - dk * ln2_lo) - f);
}
}
GET_HIGH_WORD
#define GET_HIGH_WORD(i, d)
Definition: math_private.h:103
zero
static double zero
Definition: e_log.c:91
s
GLdouble s
Definition: SDL_opengl.h:2056
int32_t
signed int int32_t
Definition: SDL_config_windows.h:61
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1567
Lg1
static double Lg1
Definition: e_log.c:80
ln2_lo
static double ln2_lo
Definition: e_log.c:78
f
GLfloat f
Definition: SDL_opengl_glext.h:1870
Lg6
static double Lg6
Definition: e_log.c:85
SET_HIGH_WORD
#define SET_HIGH_WORD(d, v)
Definition: math_private.h:131
t1
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
Definition: SDL_opengl_glext.h:8583
u_int32_t
unsigned int u_int32_t
Definition: math_private.h:29
EXTRACT_WORDS
#define EXTRACT_WORDS(ix0, ix1, d)
Definition: math_private.h:93
Lg5
static double Lg5
Definition: e_log.c:84
Lg4
static double Lg4
Definition: e_log.c:83
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:42
z
GLdouble GLdouble z
Definition: SDL_opengl_glext.h:404
Lg3
static double Lg3
Definition: e_log.c:82
Lg7
static double Lg7
Definition: e_log.c:86
two54
static double two54
Definition: e_log.c:79
w
GLubyte GLubyte GLubyte GLubyte w
Definition: SDL_opengl_glext.h:731
Lg2
static double Lg2
Definition: e_log.c:81
ln2_hi
static double ln2_hi
Definition: e_log.c:77
j
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().