diff options
author | Srinivas Vasudevan <srvasude@google.com> | 2019-08-12 19:26:29 -0400 |
---|---|---|
committer | Srinivas Vasudevan <srvasude@google.com> | 2019-08-12 19:26:29 -0400 |
commit | e38dd48a27b59b59a924b66a9486c3c2856acdf9 (patch) | |
tree | dbf29396db64c008ce982a4e3fe48c9ca53ff061 /Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h | |
parent | f59bed7a133322955dac03f3654def706aff3ba6 (diff) |
PR 681: Add ndtri function, the inverse of the normal distribution function.
Diffstat (limited to 'Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h')
-rw-r--r-- | Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h index 0fc673e12..13351d5ec 100644 --- a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +++ b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h @@ -512,5 +512,60 @@ Packet pcos_float(const Packet& x) return psincos_float<false>(x); } +/* polevl (modified for Eigen) + * + * Evaluate polynomial + * + * + * + * SYNOPSIS: + * + * int N; + * Scalar x, y, coef[N+1]; + * + * y = polevl<decltype(x), N>( x, coef); + * + * + * + * DESCRIPTION: + * + * Evaluates polynomial of degree N: + * + * 2 N + * y = C + C x + C x +...+ C x + * 0 1 2 N + * + * Coefficients are stored in reverse order: + * + * coef[0] = C , ..., coef[N] = C . + * N 0 + * + * The function p1evl() assumes that coef[N] = 1.0 and is + * omitted from the array. Its calling arguments are + * otherwise the same as polevl(). + * + * + * The Eigen implementation is templatized. For best speed, store + * coef as a const array (constexpr), e.g. + * + * const double coef[] = {1.0, 2.0, 3.0, ...}; + * + */ +template <typename Packet, int N> +struct ppolevl { + static EIGEN_STRONG_INLINE Packet run(const Packet& x, const typename unpacket_traits<Packet>::type coeff[]) { + EIGEN_STATIC_ASSERT((N > 0), YOU_MADE_A_PROGRAMMING_MISTAKE); + return pmadd(ppolevl<Packet, N-1>::run(x, coeff), x, pset1<Packet>(coeff[N])); + } +}; + +template <typename Packet> +struct ppolevl<Packet, 0> { + static EIGEN_STRONG_INLINE Packet run(const Packet& x, const typename unpacket_traits<Packet>::type coeff[]) { + EIGEN_UNUSED_VARIABLE(x); + return pset1<Packet>(coeff[0]); + } +}; + } // end namespace internal } // end namespace Eigen |