mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 11:49:02 +08:00
Enable mixing types in numext::pow
This commit is contained in:
parent
2e238bafb6
commit
5fdd703629
@ -494,24 +494,26 @@ struct log1p_retval
|
|||||||
* Implementation of pow *
|
* Implementation of pow *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
template<typename Scalar, bool IsInteger>
|
template<typename ScalarX,typename ScalarY, bool IsInteger = NumTraits<ScalarX>::IsInteger&&NumTraits<ScalarY>::IsInteger>
|
||||||
struct pow_default_impl
|
struct pow_impl
|
||||||
{
|
{
|
||||||
typedef Scalar retval;
|
//typedef Scalar retval;
|
||||||
static EIGEN_DEVICE_FUNC inline Scalar run(const Scalar& x, const Scalar& y)
|
typedef typename ScalarBinaryOpTraits<ScalarX,ScalarY,internal::scalar_binary_pow_op<ScalarX,ScalarY> >::ReturnType result_type;
|
||||||
|
static EIGEN_DEVICE_FUNC inline result_type run(const ScalarX& x, const ScalarY& y)
|
||||||
{
|
{
|
||||||
EIGEN_USING_STD_MATH(pow);
|
EIGEN_USING_STD_MATH(pow);
|
||||||
return pow(x, y);
|
return pow(x, y);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Scalar>
|
template<typename ScalarX,typename ScalarY>
|
||||||
struct pow_default_impl<Scalar, true>
|
struct pow_impl<ScalarX,ScalarY, true>
|
||||||
{
|
{
|
||||||
static EIGEN_DEVICE_FUNC inline Scalar run(Scalar x, Scalar y)
|
typedef ScalarX result_type;
|
||||||
|
static EIGEN_DEVICE_FUNC inline ScalarX run(const ScalarX &x, const ScalarY &y)
|
||||||
{
|
{
|
||||||
Scalar res(1);
|
ScalarX res(1);
|
||||||
eigen_assert(!NumTraits<Scalar>::IsSigned || y >= 0);
|
eigen_assert(!NumTraits<ScalarY>::IsSigned || y >= 0);
|
||||||
if(y & 1) res *= x;
|
if(y & 1) res *= x;
|
||||||
y >>= 1;
|
y >>= 1;
|
||||||
while(y)
|
while(y)
|
||||||
@ -524,15 +526,6 @@ struct pow_default_impl<Scalar, true>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Scalar>
|
|
||||||
struct pow_impl : pow_default_impl<Scalar, NumTraits<Scalar>::IsInteger> {};
|
|
||||||
|
|
||||||
template<typename Scalar>
|
|
||||||
struct pow_retval
|
|
||||||
{
|
|
||||||
typedef Scalar type;
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Implementation of random *
|
* Implementation of random *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -928,11 +921,11 @@ inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x)
|
|||||||
return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
|
return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Scalar>
|
template<typename ScalarX,typename ScalarY>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
inline EIGEN_MATHFUNC_RETVAL(pow, Scalar) pow(const Scalar& x, const Scalar& y)
|
inline typename internal::pow_impl<ScalarX,ScalarY>::result_type pow(const ScalarX& x, const ScalarY& y)
|
||||||
{
|
{
|
||||||
return EIGEN_MATHFUNC_IMPL(pow, Scalar)::run(x, y);
|
return internal::pow_impl<ScalarX,ScalarY>::run(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> EIGEN_DEVICE_FUNC bool (isnan) (const T &x) { return internal::isnan_impl(x); }
|
template<typename T> EIGEN_DEVICE_FUNC bool (isnan) (const T &x) { return internal::isnan_impl(x); }
|
||||||
|
@ -251,9 +251,10 @@ struct functor_traits<scalar_hypot_op<Scalar,Scalar> > {
|
|||||||
* \brief Template functor to compute the pow of two scalars
|
* \brief Template functor to compute the pow of two scalars
|
||||||
*/
|
*/
|
||||||
template<typename Scalar, typename OtherScalar> struct scalar_binary_pow_op {
|
template<typename Scalar, typename OtherScalar> struct scalar_binary_pow_op {
|
||||||
|
typedef typename ScalarBinaryOpTraits<Scalar,OtherScalar,scalar_binary_pow_op>::ReturnType result_type;
|
||||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_binary_pow_op)
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_binary_pow_op)
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
inline Scalar operator() (const Scalar& a, const OtherScalar& b) const { return numext::pow(a, b); }
|
inline result_type operator() (const Scalar& a, const OtherScalar& b) const { return numext::pow(a, b); }
|
||||||
};
|
};
|
||||||
template<typename Scalar, typename OtherScalar>
|
template<typename Scalar, typename OtherScalar>
|
||||||
struct functor_traits<scalar_binary_pow_op<Scalar,OtherScalar> > {
|
struct functor_traits<scalar_binary_pow_op<Scalar,OtherScalar> > {
|
||||||
|
@ -217,6 +217,7 @@ template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_
|
|||||||
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;
|
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;
|
||||||
template<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;
|
template<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;
|
||||||
template<typename LhsScalar,typename RhsScalar> struct scalar_quotient2_op;
|
template<typename LhsScalar,typename RhsScalar> struct scalar_quotient2_op;
|
||||||
|
template<typename ScalarX, typename ScalarY> struct scalar_binary_pow_op;
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user