quad_float ldexp(const quad_float& x, long exp) { // x*2^exp double xhi, xlo; quad_float z; xhi = _ntl_ldexp(x.hi, exp); xlo = _ntl_ldexp(x.lo, exp); normalize(z, xhi, xlo); return z; }
void power2(xdouble& z, long e) { long hb = NTL_XD_HBOUND_LOG; long b = 2*hb; long q, r; q = e/b; r = e%b; while (r >= hb) { r -= b; q++; } while (r < -hb) { r += b; q--; } if (q >= NTL_OVFBND) ResourceError("xdouble: overflow"); if (q <= -NTL_OVFBND) ResourceError("xdouble: underflow"); double x = _ntl_ldexp(1.0, r); z.x = x; z.e = q; }
void conv(double& z, const RR& aa) { double x; NTL_TLS_LOCAL(RR, a); ConvPrec(a, aa, NTL_DOUBLE_PRECISION); // round to NTL_DOUBLE_PRECISION bits to avoid double overflow conv(x, a.x); z = _ntl_ldexp(x, a.e); }
void power2(quad_float& z, long e) { z.hi = _ntl_ldexp(1.0, e); z.lo = 0; }