mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-12 09:23:12 +08:00
bug #1189: fix pow/atan2 compilation for AutoDiffScalar
This commit is contained in:
parent
158fea0f5e
commit
4d7e230d2f
@ -589,23 +589,24 @@ EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(log,
|
|||||||
return ReturnType(log(x.value()),x.derivatives() * (Scalar(1)/x.value()));)
|
return ReturnType(log(x.value()),x.derivatives() * (Scalar(1)/x.value()));)
|
||||||
|
|
||||||
template<typename DerType>
|
template<typename DerType>
|
||||||
inline const Eigen::AutoDiffScalar<Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<typename Eigen::internal::traits<DerType>::Scalar>, const DerType> >
|
inline const Eigen::AutoDiffScalar<Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<typename internal::traits<typename internal::remove_all<DerType>::type>::Scalar>, const typename internal::remove_all<DerType>::type> >
|
||||||
pow(const Eigen::AutoDiffScalar<DerType>& x, typename Eigen::internal::traits<DerType>::Scalar y)
|
pow(const Eigen::AutoDiffScalar<DerType>& x, typename internal::traits<typename internal::remove_all<DerType>::type>::Scalar y)
|
||||||
{
|
{
|
||||||
using namespace Eigen;
|
using namespace Eigen;
|
||||||
typedef typename Eigen::internal::traits<DerType>::Scalar Scalar;
|
typedef typename internal::remove_all<DerType>::type DerTypeCleaned;
|
||||||
return AutoDiffScalar<CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const DerType> >(
|
typedef typename Eigen::internal::traits<DerTypeCleaned>::Scalar Scalar;
|
||||||
|
return AutoDiffScalar<CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const DerTypeCleaned> >(
|
||||||
std::pow(x.value(),y),
|
std::pow(x.value(),y),
|
||||||
x.derivatives() * (y * std::pow(x.value(),y-1)));
|
x.derivatives() * (y * std::pow(x.value(),y-1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename DerTypeA,typename DerTypeB>
|
template<typename DerTypeA,typename DerTypeB>
|
||||||
inline const AutoDiffScalar<Matrix<typename internal::traits<DerTypeA>::Scalar,Dynamic,1> >
|
inline const AutoDiffScalar<Matrix<typename internal::traits<typename internal::remove_all<DerTypeA>::type>::Scalar,Dynamic,1> >
|
||||||
atan2(const AutoDiffScalar<DerTypeA>& a, const AutoDiffScalar<DerTypeB>& b)
|
atan2(const AutoDiffScalar<DerTypeA>& a, const AutoDiffScalar<DerTypeB>& b)
|
||||||
{
|
{
|
||||||
using std::atan2;
|
using std::atan2;
|
||||||
typedef typename internal::traits<DerTypeA>::Scalar Scalar;
|
typedef typename internal::traits<typename internal::remove_all<DerTypeA>::type>::Scalar Scalar;
|
||||||
typedef AutoDiffScalar<Matrix<Scalar,Dynamic,1> > PlainADS;
|
typedef AutoDiffScalar<Matrix<Scalar,Dynamic,1> > PlainADS;
|
||||||
PlainADS ret;
|
PlainADS ret;
|
||||||
ret.value() = atan2(a.value(), b.value());
|
ret.value() = atan2(a.value(), b.value());
|
||||||
|
@ -16,7 +16,7 @@ EIGEN_DONT_INLINE Scalar foo(const Scalar& x, const Scalar& y)
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
// return x+std::sin(y);
|
// return x+std::sin(y);
|
||||||
EIGEN_ASM_COMMENT("mybegin");
|
EIGEN_ASM_COMMENT("mybegin");
|
||||||
return static_cast<Scalar>(x*2 - pow(x,2) + 2*sqrt(y*y) - 4 * sin(x) + 2 * cos(y) - exp(-0.5*x*x));
|
return static_cast<Scalar>(x*2 - 1 + pow(1+x,2) + 2*sqrt(y*y+0) - 4 * sin(0+x) + 2 * cos(y+0) - exp(-0.5*x*x+0));
|
||||||
//return x+2*y*x;//x*2 -std::pow(x,2);//(2*y/x);// - y*2;
|
//return x+2*y*x;//x*2 -std::pow(x,2);//(2*y/x);// - y*2;
|
||||||
EIGEN_ASM_COMMENT("myend");
|
EIGEN_ASM_COMMENT("myend");
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,10 @@ template<typename Scalar> void check_atan2()
|
|||||||
|
|
||||||
VERIFY_IS_APPROX(res.value(), x.value());
|
VERIFY_IS_APPROX(res.value(), x.value());
|
||||||
VERIFY_IS_APPROX(res.derivatives(), x.derivatives());
|
VERIFY_IS_APPROX(res.derivatives(), x.derivatives());
|
||||||
|
|
||||||
|
res = atan2(r*s+0, r*c+0);
|
||||||
|
VERIFY_IS_APPROX(res.value(), x.value());
|
||||||
|
VERIFY_IS_APPROX(res.derivatives(), x.derivatives());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user