From 13ef08e5ac96e474ce40031b868b2f7625014573 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen Date: Fri, 27 Sep 2019 13:56:04 -0700 Subject: Move implementation of vectorized error function erf() to SpecialFunctionsImpl.h. --- Eigen/src/Core/MathFunctionsImpl.h | 54 +------------------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) (limited to 'Eigen/src/Core/MathFunctionsImpl.h') diff --git a/Eigen/src/Core/MathFunctionsImpl.h b/Eigen/src/Core/MathFunctionsImpl.h index c4957fbc2..aff3967ca 100644 --- a/Eigen/src/Core/MathFunctionsImpl.h +++ b/Eigen/src/Core/MathFunctionsImpl.h @@ -66,58 +66,6 @@ T generic_fast_tanh_float(const T& a_x) return pdiv(p, q); } -/** \internal \returns the error function of \a a (coeff-wise) - Doesn't do anything fancy, just a 13/8-degree rational interpolant which - is accurate up to a couple of ulp in the range [-4, 4], outside of which - fl(erf(x)) = +/-1. - - This implementation works on both scalars and Ts. -*/ -template -T generic_fast_erf_float(const T& a_x) { - // Clamp the inputs to the range [-4, 4] since anything outside - // this range is +/-1.0f in single-precision. - const T plus_4 = pset1(4.f); - const T minus_4 = pset1(-4.f); - const T x = pmax(pmin(a_x, plus_4), minus_4); - // The monomial coefficients of the numerator polynomial (odd). - const T alpha_1 = pset1(-1.60960333262415e-02f); - const T alpha_3 = pset1(-2.95459980854025e-03f); - const T alpha_5 = pset1(-7.34990630326855e-04f); - const T alpha_7 = pset1(-5.69250639462346e-05f); - const T alpha_9 = pset1(-2.10102402082508e-06f); - const T alpha_11 = pset1(2.77068142495902e-08f); - const T alpha_13 = pset1(-2.72614225801306e-10f); - - // The monomial coefficients of the denominator polynomial (even). - const T beta_0 = pset1(-1.42647390514189e-02f); - const T beta_2 = pset1(-7.37332916720468e-03f); - const T beta_4 = pset1(-1.68282697438203e-03f); - const T beta_6 = pset1(-2.13374055278905e-04f); - const T beta_8 = pset1(-1.45660718464996e-05f); - - // Since the polynomials are odd/even, we need x^2. - const T x2 = pmul(x, x); - - // Evaluate the numerator polynomial p. - T p = pmadd(x2, alpha_13, alpha_11); - p = pmadd(x2, p, alpha_9); - p = pmadd(x2, p, alpha_7); - p = pmadd(x2, p, alpha_5); - p = pmadd(x2, p, alpha_3); - p = pmadd(x2, p, alpha_1); - p = pmul(x, p); - - // Evaluate the denominator polynomial p. - T q = pmadd(x2, beta_8, beta_6); - q = pmadd(x2, q, beta_4); - q = pmadd(x2, q, beta_2); - q = pmadd(x2, q, beta_0); - - // Divide the numerator by the denominator. - return pdiv(p, q); -} - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE RealScalar positive_real_hypot(const RealScalar& x, const RealScalar& y) @@ -126,7 +74,7 @@ RealScalar positive_real_hypot(const RealScalar& x, const RealScalar& y) RealScalar p, qp; p = numext::maxi(x,y); if(p==RealScalar(0)) return RealScalar(0); - qp = numext::mini(y,x) / p; + qp = numext::mini(y,x) / p; return p * sqrt(RealScalar(1) + qp*qp); } -- cgit v1.2.3