mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-15 07:10:37 +08:00
log1p is defined only for real Scalars in C++11
This commit is contained in:
parent
6af6cf0c2e
commit
ecbf2a6656
@ -362,26 +362,32 @@ inline NewType cast(const OldType& x)
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Implementation of logp1 *
|
* Implementation of logp1 *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
template<typename Scalar, bool isComplex = NumTraits<Scalar>::IsComplex >
|
||||||
template<typename Scalar>
|
|
||||||
struct log1p_impl
|
struct log1p_impl
|
||||||
{
|
{
|
||||||
static inline Scalar run(const Scalar& x)
|
static inline Scalar run(const Scalar& x)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
|
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
|
||||||
// Let's be conservative and enable the default C++11 implementation only if we are sure it exists
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
#if (__cplusplus >= 201103L) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_CLANG || EIGEN_COMP_MSVC || EIGEN_COMP_ICC) \
|
using std::log;
|
||||||
&& (EIGEN_ARCH_i386_OR_x86_64) && (EIGEN_OS_GNULINUX || EIGEN_OS_WIN_STRICT || EIGEN_OS_MAC)
|
Scalar x1p = RealScalar(1) + x;
|
||||||
using std::log1p;
|
return ( x1p == Scalar(1) ) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
|
||||||
return log1p(x);
|
|
||||||
#else
|
|
||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
|
||||||
using std::log;
|
|
||||||
Scalar x1p = RealScalar(1) + x;
|
|
||||||
return ( x1p == Scalar(1) ) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// In C++11 we can specialize log1p_impl for real Scalars
|
||||||
|
// Let's be conservative and enable the default C++11 implementation only if we are sure it exists
|
||||||
|
#if (__cplusplus >= 201103L) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_CLANG || EIGEN_COMP_MSVC || EIGEN_COMP_ICC) \
|
||||||
|
&& (EIGEN_ARCH_i386_OR_x86_64) && (EIGEN_OS_GNULINUX || EIGEN_OS_WIN_STRICT || EIGEN_OS_MAC)
|
||||||
|
template<typename Scalar>
|
||||||
|
struct log1p_impl<Scalar, false> {
|
||||||
|
static inline Scalar run(const Scalar& x)
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
|
||||||
|
using std::log1p;
|
||||||
|
return log1p(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
template<typename Scalar>
|
template<typename Scalar>
|
||||||
struct log1p_retval
|
struct log1p_retval
|
||||||
|
Loading…
Reference in New Issue
Block a user