144 static partial class fdlibm
146 static readonly
int[] init_jk = { 2, 3, 4, 6 };
148 static readonly
double[] PIo2 = {
149 1.57079625129699707031e+00,
150 7.54978941586159635335e-08,
151 5.39030252995776476554e-15,
152 3.28200341580791294123e-22,
153 1.27065575308067607349e-29,
154 1.22933308981111328932e-36,
155 2.73370053816464559624e-44,
156 2.16741683877804819444e-51,
159 static int __kernel_rem_pio2(
double[] x,
ref double y_0_,
ref double y_1_,
ref double y_2_,
int e0,
int nx,
int prec,
int[] ipio2)
164 two24 = 1.67772160000000000000e+07,
165 twon24 = 5.96046447753906250000e-08;
167 int jz, jx, jv, jp, jk, carry, n, i, j, k, m, q0, ih;
168 int[] iq =
new int[20];
170 double[] f =
new double[20];
171 double[] fq =
new double[20];
172 double[] q =
new double[20];
180 jv = (e0 - 3) / 24;
if (jv < 0) jv = 0;
181 q0 = e0 - 24 * (jv + 1);
184 j = jv - jx; m = jx + jk;
185 for (i = 0; i <= m; i++, j++) f[i] = (j < 0) ? zero : (double)ipio2[j];
188 for (i = 0; i <= jk; i++)
190 for (j = 0, fw = 0.0; j <= jx; j++) fw += x[j] * f[jx + i - j]; q[i] = fw;
196 for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--)
198 fw = (double)((
int)(twon24 * z));
199 iq[i] = (int)(z - two24 * fw);
205 z -= 8.0 * floor(z * 0.125);
211 i = (iq[jz - 1] >> (24 - q0)); n += i;
212 iq[jz - 1] -= i << (24 - q0);
213 ih = iq[jz - 1] >> (23 - q0);
215 else if (q0 == 0) ih = iq[jz - 1] >> 23;
216 else if (z >= 0.5) ih = 2;
221 for (i = 0; i < jz; i++)
228 carry = 1; iq[i] = 0x1000000 - j;
231 else iq[i] = 0xffffff - j;
238 iq[jz - 1] &= 0x7fffff;
break;
240 iq[jz - 1] &= 0x3fffff;
break;
246 if (carry != 0) z -= scalbn(one, q0);
254 for (i = jz - 1; i >= jk; i--) j |= iq[i];
257 for (k = 1; iq[jk - k] == 0; k++) ;
259 for (i = jz + 1; i <= jz + k; i++)
261 f[jx + i] = (double)ipio2[jv + i];
262 for (j = 0, fw = 0.0; j <= jx; j++) fw += x[j] * f[jx + i - j];
274 while (iq[jz] == 0) { jz--; q0 -= 24; }
281 fw = (double)((
int)(twon24 * z));
282 iq[jz] = (int)(z - two24 * fw);
286 else iq[jz] = (int)z;
290 fw = scalbn(one, q0);
291 for (i = jz; i >= 0; i--)
293 q[i] = fw * (double)iq[i]; fw *= twon24;
297 for (i = jz; i >= 0; i--)
299 for (fw = 0.0, k = 0; k <= jp && k <= jz - i; k++) fw += PIo2[k] * q[i + k];
308 for (i = jz; i >= 0; i--) fw += fq[i];
309 y_0_ = (ih == 0) ? fw : -fw;
314 for (i = jz; i >= 0; i--) fw += fq[i];
315 y_0_ = (ih == 0) ? fw : -fw;
317 for (i = 1; i <= jz; i++) fw += fq[i];
318 y_1_ = (ih == 0) ? fw : -fw;
321 for (i = jz; i > 0; i--)
323 fw = fq[i - 1] + fq[i];
324 fq[i] += fq[i - 1] - fw;
327 for (i = jz; i > 1; i--)
329 fw = fq[i - 1] + fq[i];
330 fq[i] += fq[i - 1] - fw;
333 for (fw = 0.0, i = jz; i >= 2; i--) fw += fq[i];
336 y_0_ = fq[0]; y_1_ = fq[1]; y_2_ = fw;
340 y_0_ = -fq[0]; y_1_ = -fq[1]; y_2_ = -fw;