e_rem_pio2.c File Reference
`#include "math_libm.h"`
`#include "math_private.h"`
Include dependency graph for e_rem_pio2.c:

Go to the source code of this file.

## Functions

| libm_hidden_proto (fabs)
int32_t attribute_hidden | __ieee754_rem_pio2 (double x, y)

## Variables

static int32_t | npio2_hw []
static double | zero = 0.00000000000000000000e+00
static double | half = 5.00000000000000000000e-01
static double | two24 = 1.67772160000000000000e+07
static double | invpio2 = 6.36619772367581382433e-01
static double | pio2_1 = 1.57079632673412561417e+00
static double | pio2_1t = 6.07710050650619224932e-11
static double | pio2_2 = 6.07710050630396597660e-11
static double | pio2_2t = 2.02226624879595063154e-21
static double | pio2_3 = 2.02226624871116645580e-21
static double | pio2_3t = 8.47842766036889956997e-32

## Function Documentation

int32_t attribute_hidden __ieee754_rem_pio2 | ( | double | x,
|  | y |
| ) |  |

Definition at line 94 of file e_rem_pio2.c.

References __kernel_rem_pio2(), fabs, GET_HIGH_WORD, GET_LOW_WORD, half, i, invpio2, j, pio2_1, pio2_1t, pio2_2, pio2_2t, pio2_3, pio2_3t, SET_HIGH_WORD, SET_LOW_WORD, two24, and zero.

Referenced by libm_hidden_proto(), and tan().

{
double z = 0.0, w, t, r, fn;
double tx[3];
int32_t e0, i, j, nx, n, ix, hx;
u_int32_t low;
GET_HIGH_WORD(hx, x); /* high word of x */
ix = hx & 0x7fffffff;
if (ix <= 0x3fe921fb) { /* |x| ~<= pi/4 , no need for reduction */
y[0] = x;
y[1] = 0;
return 0;
}
if (ix < 0x4002d97c) { /* |x| < 3pi/4, special case with n=+-1 */
if (hx > 0) {
z = x - pio2_1;
if (ix != 0x3ff921fb) { /* 33+53 bit pi is good enough */
y[0] = z - pio2_1t;
y[1] = (z - y[0]) - pio2_1t;
} else { /* near pi/2, use 33+33+53 bit pi */
z -= pio2_2;
y[0] = z - pio2_2t;
y[1] = (z - y[0]) - pio2_2t;
}
return 1;
} else { /* negative x */
z = x + pio2_1;
if (ix != 0x3ff921fb) { /* 33+53 bit pi is good enough */
y[0] = z + pio2_1t;
y[1] = (z - y[0]) + pio2_1t;
} else { /* near pi/2, use 33+33+53 bit pi */
z += pio2_2;
y[0] = z + pio2_2t;
y[1] = (z - y[0]) + pio2_2t;
}
return -1;
}
}
if (ix <= 0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */
t = fabs(x);
n = (int32_t) (t * invpio2 + half);
fn = (double) n;
r = t - fn * pio2_1;
w = fn * pio2_1t; /* 1st round good to 85 bit */
if (n < 32 && ix != npio2_hw[n - 1]) {
y[0] = r - w; /* quick check no cancellation */
} else {
u_int32_t high;
j = ix >> 20;
y[0] = r - w;
GET_HIGH_WORD(high, y[0]);
i = j - ((high >> 20) & 0x7ff);
if (i > 16) { /* 2nd iteration needed, good to 118 */
t = r;
w = fn * pio2_2;
r = t - w;
w = fn * pio2_2t - ((t - r) - w);
y[0] = r - w;
GET_HIGH_WORD(high, y[0]);
i = j - ((high >> 20) & 0x7ff);
if (i > 49) { /* 3rd iteration need, 151 bits acc */
t = r; /* will cover all possible cases */
w = fn * pio2_3;
r = t - w;
w = fn * pio2_3t - ((t - r) - w);
y[0] = r - w;
}
}
}
y[1] = (r - y[0]) - w;
if (hx < 0) {
y[0] = -y[0];
y[1] = -y[1];
return -n;
} else
return n;
}
/*
* all other (large) arguments
*/
if (ix >= 0x7ff00000) { /* x is inf or NaN */
y[0] = y[1] = x - x;
return 0;
}
/* set z = scalbn(|x|,ilogb(x)-23) */
GET_LOW_WORD(low, x);
SET_LOW_WORD(z, low);
e0 = (ix >> 20) - 1046; /* e0 = ilogb(z)-23; */
SET_HIGH_WORD(z, ix - ((int32_t) (e0 << 20)));
for (i = 0; i < 2; i++) {
tx[i] = (double) ((int32_t) (z));
z = (z - tx[i]) * two24;
}
tx[2] = z;
nx = 3;
while (tx[nx - 1] == zero)
nx--; /* skip zero term */
n = __kernel_rem_pio2(tx, y, e0, nx, 2, two_over_pi);
if (hx < 0) {
y[0] = -y[0];
y[1] = -y[1];
return -n;
}
return n;
}
GET_HIGH_WORD
#define GET_HIGH_WORD(i, d)
Definition: math_private.h:103
r
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2072
n
GLdouble n
Definition: SDL_opengl_glext.h:1952
invpio2
static double invpio2
Definition: e_rem_pio2.c:81
int32_t
signed int int32_t
Definition: SDL_config_windows.h:61
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1567
__kernel_rem_pio2
int attribute_hidden __kernel_rem_pio2(x, y, int e0, int nx, int prec, ipio2)
Definition: k_rem_pio2.c:176
half
static double half
Definition: e_rem_pio2.c:79
two24
static double two24
Definition: e_rem_pio2.c:80
pio2_1t
static double pio2_1t
Definition: e_rem_pio2.c:83
SET_HIGH_WORD
#define SET_HIGH_WORD(d, v)
Definition: math_private.h:131
pio2_2
static double pio2_2
Definition: e_rem_pio2.c:84
pio2_3t
static double pio2_3t
Definition: e_rem_pio2.c:87
u_int32_t
unsigned int u_int32_t
Definition: math_private.h:29
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1567
pio2_1
static double pio2_1
Definition: e_rem_pio2.c:82
SET_LOW_WORD
#define SET_LOW_WORD(d, v)
Definition: math_private.h:141
nx
GLbyte nx
Definition: SDL_opengl_glext.h:5713
pio2_3
static double pio2_3
Definition: e_rem_pio2.c:86
fabs
#define fabs
Definition: math_private.h:36
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
pio2_2t
static double pio2_2t
Definition: e_rem_pio2.c:85
z
GLdouble GLdouble z
Definition: SDL_opengl_glext.h:404
GET_LOW_WORD
#define GET_LOW_WORD(i, d)
Definition: math_private.h:112
npio2_hw
static int32_t npio2_hw[]
Definition: e_rem_pio2.c:53
w
GLubyte GLubyte GLubyte GLubyte w
Definition: SDL_opengl_glext.h:731
zero
static double zero
Definition: e_rem_pio2.c:78
t
GLdouble GLdouble t
Definition: SDL_opengl.h:2064
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

libm_hidden_proto | ( | fabs |  | ) |

Definition at line 27 of file e_rem_pio2.c.

References npio2_hw.

{
#else
static int32_t two_over_pi[] = {
#endif
0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
};
int32_t
signed int int32_t
Definition: SDL_config_windows.h:61

## Variable Documentation

double half = 5.00000000000000000000e-01

static

Definition at line 79 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

double invpio2 = 6.36619772367581382433e-01

static

Definition at line 81 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

int32_t npio2_hw[]

static

Initial value:
= {
0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C,
0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C,
0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A,
0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C,
0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB,
0x404858EB, 0x404921FB,
}

Definition at line 53 of file e_rem_pio2.c.

Referenced by libm_hidden_proto().

double pio2_1 = 1.57079632673412561417e+00

static

Definition at line 82 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

double pio2_1t = 6.07710050650619224932e-11

static

Definition at line 83 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

double pio2_2 = 6.07710050630396597660e-11

static

Definition at line 84 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

double pio2_2t = 2.02226624879595063154e-21

static

Definition at line 85 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

double pio2_3 = 2.02226624871116645580e-21

static

Definition at line 86 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

double pio2_3t = 8.47842766036889956997e-32

static

Definition at line 87 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

double two24 = 1.67772160000000000000e+07

static

Definition at line 80 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().

double zero = 0.00000000000000000000e+00

static

Definition at line 78 of file e_rem_pio2.c.

Referenced by __ieee754_rem_pio2().