Lines Matching defs:dx
66 // Return expm1(dx) / x ~ 1 + dx / 2 + dx^2 / 6 + dx^3 / 24.
67 // For |dx| < 2^-13 + 2^-30:
68 // | output - expm1(dx) / dx | < 2^-51.
69 LIBC_INLINE double poly_approx_d(double dx) {
70 // dx^2
71 double dx2 = dx * dx;
72 // c0 = 1 + dx / 2
73 double c0 = fputil::multiply_add(dx, 0.5, 1.0);
74 // c1 = 1/6 + dx / 24
76 fputil::multiply_add(dx, 0x1.5555555555555p-5, 0x1.5555555555555p-3);
77 // p = dx^2 * c1 + c0 = 1 + dx / 2 + dx^2 / 6 + dx^3 / 24
83 // Return expm1(dx) / dx ~ 1 + dx / 2 + dx^2 / 6 + ... + dx^6 / 5040
84 // For |dx| < 2^-13 + 2^-30:
85 // | output - expm1(dx) | < 2^-101
86 DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
98 DoubleDouble p = fputil::polyeval(dx, COEFFS[0], COEFFS[1], COEFFS[2],
104 // Return (exp(dx) - 1)/dx ~ 1 + dx / 2 + dx^2 / 6 + ... + dx^6 / 5040
105 // For |dx| < 2^-13 + 2^-30:
106 // | output - exp(dx) | < 2^-126.
107 [[maybe_unused]] Float128 poly_approx_f128(const Float128 &dx) {
118 Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],
142 // Recalculate dx:
148 Float128 dx = fputil::quick_add(
170 Float128 p = poly_approx_f128(dx);
172 // r = exp_mid * (1 + dx * P) - 1
173 // = (exp_mid - 1) + (dx * exp_mid) * P
175 fputil::multiply_add(fputil::quick_mul(exp_mid, dx), p, exp_mid_m1);
183 << " minus_one: " << minus_one << " dx: " << dx
194 // Recalculate dx:
195 // dx = x - k * 2^-12 * log(2)
200 DoubleDouble dx = fputil::exact_add(t1, t2);
201 dx.lo += t3;
205 DoubleDouble p = poly_approx_dd(dx);
209 fputil::multiply_add(fputil::quick_mult(exp_mid, dx), p, hi_part);
213 << " dx: " << dx << " p: " << p << " r: " << r << std::endl;
403 // |x - (hi + mid1 + mid2) * log(2) - dx| < 2^11 * eps(M_LOG_2_EXP2_M12.lo)
406 // |dx| < 2^-13 + 2^-30.
408 double dx = fputil::multiply_add(kd, MLOG_2_EXP2_M12_MID, lo_h);
417 // |P_(dx) - P(dx)| < 2^-51
418 // => |dx * P_(dx) - expm1(lo) | < 1.5 * 2^-64
419 // => 2^(mid1 + mid2) * |dx * P_(dx) - expm1(lo)| < 1.5 * 2^-63.
423 // (exp_mid.hi + exp_mid.lo) * (1 + dx * P_(dx)) ~
424 // ~ exp_mid.hi + (exp_mid.hi * dx * P_(dx) + exp_mid.lo)
431 // + (exp_mid.hi * dx * P_(dx) + exp_mid.lo))
433 double mid_lo = dx * exp_mid.hi;
435 // Approximate expm1(dx)/dx ~ 1 + dx / 2 + dx^2 / 6 + dx^3 / 24.
436 double p = poly_approx_d(dx);
456 << " dx: " << std::hexfloat << dx << std::defaultfloat << "\n"