5 #ifndef __pinocchio_math_mutliprecision_hpp__ 6 #define __pinocchio_math_mutliprecision_hpp__ 8 #include "pinocchio/math/fwd.hpp" 10 #include <boost/multiprecision/number.hpp> 11 #include <Eigen/Dense> 17 template <
class Backend, boost::multiprecision::expression_
template_option ExpressionTemplates,
typename Scalar>
18 struct cast_impl<boost::multiprecision::number<Backend, ExpressionTemplates>,Scalar>
20 #if EIGEN_VERSION_AT_LEAST(3,2,90) 23 static inline Scalar run(
const boost::multiprecision::number<Backend, ExpressionTemplates> & x)
25 return x.template convert_to<Scalar>();
31 #ifndef BOOST_MP_EIGEN_HPP 39 template <
class Backend, boost::multiprecision::expression_
template_option ExpressionTemplates>
40 struct NumTraits<boost::multiprecision::number<Backend, ExpressionTemplates> >
42 typedef boost::multiprecision::number<Backend, ExpressionTemplates> self_type;
43 #if BOOST_VERSION / 100 % 1000 >= 68 44 typedef typename boost::multiprecision::scalar_result_from_possible_complex<self_type>::type Real;
46 typedef self_type Real;
48 typedef self_type NonInteger;
49 typedef double Literal;
50 typedef self_type Nested;
53 #if BOOST_VERSION / 100 % 1000 >= 68 54 IsComplex = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_complex,
58 IsInteger = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer,
62 IsSigned = std::numeric_limits<self_type>::is_specialized ? std::numeric_limits<self_type>::is_signed :
true,
63 RequireInitialization = 1
67 return std::numeric_limits<Real>::epsilon();
69 static Real dummy_precision()
71 return 1000 * epsilon();
75 return (std::numeric_limits<Real>::max)();
79 return (std::numeric_limits<Real>::min)();
81 static int digits10_imp(
const boost::mpl::true_&)
83 return std::numeric_limits<Real>::digits10;
86 static int digits10_imp(
const boost::mpl::bool_<B>&)
88 return Real::default_precision();
92 return digits10_imp(boost::mpl::bool_ < std::numeric_limits<Real>::digits10 && (std::numeric_limits<Real>::digits10 != INT_MAX) ?
true :
false > ());
96 template <
class tag,
class Arg1,
class Arg2,
class Arg3,
class Arg4>
97 struct NumTraits<
boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > :
public NumTraits<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>
104 template <
class Backend, boost::multiprecision::expression_
template_option ExpressionTemplates,
class tag,
class Arg1,
class Arg2,
class Arg3,
class Arg4>
105 struct scalar_product_traits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >
108 typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;
111 template <
class tag,
class Arg1,
class Arg2,
class Arg3,
class Arg4,
class Backend, boost::multiprecision::expression_
template_option ExpressionTemplates>
112 struct scalar_product_traits<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, boost::multiprecision::number<Backend, ExpressionTemplates> >
115 typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;
118 template <
typename Scalar>
121 template <
typename Scalar,
bool IsComplex>
124 template <
class tag,
class Arg1,
class Arg2,
class Arg3,
class Arg4>
125 struct conj_retval<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >
127 typedef typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type type;
130 template <
class tag,
class Arg1,
class Arg2,
class Arg3,
class Arg4>
131 struct conj_impl<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, true>
133 #if EIGEN_VERSION_AT_LEAST(3,2,90) 136 static inline typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type run(
const typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& x)
146 #endif // ifndef BOOST_MP_EIGEN_HPP 148 #endif // ifndef __pinocchio_math_mutliprecision_hpp__
Source from #include <cppad/example/cppad_eigen.hpp>