inline A0 finalize(const A0& fe,const A0& x,const A0& x2,A0 y) { y = amul(y, -Half<A0>(), x2); // multiply log of fraction by log10(e) and base 2 exponent by log10(2) A0 z = mul(x+y, Const<A0, 0x3a37b152>());//7.00731903251827651129E-4f // log10(e)lo z = amul(z, y, Const<A0, 0x3ede0000>()); //4.3359375E-1f // log10(e)hi z = amul(z, x, Const<A0, 0x3ede0000>()); z = amul(z, fe, Const<A0, 0x39826a14>());//3.0078125E-1f // log10(2)hi return amul(z, fe, Const<A0, 0x3e9a0000>());//2.48745663981195213739E-4f // log10(2)lo }
int utpm_imul(int P, int D, int M, int N, double *y, int ldy, double *x, int ldx){ /* computes Y *= X in Taylor arithmetic */ int k,d,p; double *xd, *yd, *zd; double *xp, *yp; int pstridex, pstridey; int dstridex, dstridey; dstridex = ldx*N; dstridey = ldy*N; pstridex = (D-1)*dstridex; pstridey = (D-1)*dstridey; /* d > 0: higher order coefficients */ for(p = 0; p < P; ++p){ xp = x + p*pstridex; yp = y + p*pstridey; for(d = D-1; 0 < d; --d){ /* compute y_d += x_0 y_d */ xd = x; yd = yp + d*dstridey; zd = yd; imul(M, N, yd, ldy, xd, ldx); /* compute y_d += sum_{k=1}^{d-1} x_k y_{d-k} */ xd = xp + dstridex; yd = yp + (d-1)*dstridey; for(k = 1; k < d; ++k){ amul(M, N, xd, ldx, yd, ldy, zd, ldy); ++xd; yd -= (2*dstridey-1); } /* compute y_d += x_d y_0 */ yd = y; xd = xp + d*dstridex; amul(M, N, xd, ldx, yd, ldy, zd, ldy); } } yd = y; xd = x; /* d = 0: base point z_0 */ imul(M, N, yd, ldy, xd, ldx); return 0; }
static inline A0 log10(const A0& a0) { A0 x, fe, x2, y; kernel_log(a0, fe, x, x2, y); y = amul(y, -Half<A0>(), x2); // multiply log of fraction by log10(e) and base 2 exponent by log10(2) A0 z = mul(x+y, single_constant<A0, 0x3a37b152>());//7.00731903251827651129E-4f // log10(e)lo z = amul(z, y, single_constant<A0, 0x3ede0000>()); //4.3359375E-1f // log10(e)hi z = amul(z, x, single_constant<A0, 0x3ede0000>()); z = amul(z, fe, single_constant<A0, 0x39826a14>());//3.0078125E-1f // log10(2)hi z = amul(z, fe, single_constant<A0, 0x3e9a0000>());//2.48745663981195213739E-4f // log10(2)lo A0 y1 = a0-rec(abs(a0)); // trick to reduce selection testing return seladd(is_inf(y1), b_or(z, b_or(is_ltz(a0), is_nan(a0))),y1); }
inline float log10(const float& a0) { typedef float A0; if (a0 == Inf<A0>()) return a0; if (iseqz(a0)) return Minf<A0>(); if (nt2::is_nan(a0)||isltz(a0)) return Nan<A0>(); A0 x, fe, x2, y; kernel_log(a0, fe, x, x2, y); y = amul(y, -Half<A0>(), x2); // multiply log of fraction by log10(e) and base 2 exponent by log10(2) A0 z = mul(x+y, Const<float, 0x3a37b152>());//7.00731903251827651129E-4f // log10(e)lo z = amul(z, y, Const<float, 0x3ede0000>()); //4.3359375E-1f // log10(e)hi z = amul(z, x, Const<float, 0x3ede0000>()); z = amul(z, fe, Const<float, 0x39826a14>());//3.0078125E-1f // log10(2)hi return amul(z, fe, Const<float, 0x3e9a0000 >());//2.48745663981195213739E-4f // log10(2)lo }
static inline A0 log10(const A0& a0) { typedef typename meta::strip<A0>::type stA0; if (a0 == Inf<stA0>()) return a0; if (is_eqz(a0)) return Minf<stA0>(); if (nt2::is_nan(a0)||is_ltz(a0)) return Nan<stA0>(); A0 x, fe, x2, y; kernel_log(a0, fe, x, x2, y); y = amul(y, Mhalf<stA0>(), x2); // multiply log of fraction by log10(e) and base 2 exponent by log10(2) A0 z = mul(x+y, single_constant<stA0, 0x3a37b152>());//7.00731903251827651129E-4f // log10(e)lo z = amul(z, y, single_constant<stA0, 0x3ede0000>()); //4.3359375E-1f // log10(e)hi z = amul(z, x, single_constant<stA0, 0x3ede0000>()); z = amul(z, fe, single_constant<stA0, 0x39826a14>());//3.0078125E-1f // log10(2)hi return amul(z, fe, single_constant<stA0, 0x3e9a0000 >());//2.48745663981195213739E-4f // log10(2)lo }