5 #ifndef __pinocchio_math_mutliprecision_hpp__ 
    6 #define __pinocchio_math_mutliprecision_hpp__ 
   10 #include <boost/multiprecision/number.hpp> 
   11 #include <boost/random.hpp> 
   12 #include <Eigen/Dense> 
   18   template<
typename Backend, boost::multiprecision::expression_
template_option ET>
 
   20   : boost::integral_constant<
 
   22       ((!std::numeric_limits<boost::multiprecision::number<Backend, ET>>::is_integer
 
   23         && std::numeric_limits<boost::multiprecision::number<Backend, ET>>::has_infinity))>
 
   34       boost::multiprecision::expression_template_option ExpressionTemplates,
 
   36     struct cast_impl<
boost::multiprecision::number<Backend, ExpressionTemplates>, 
Scalar>
 
   38 #if EIGEN_VERSION_AT_LEAST(3, 2, 90) 
   42       run(
const boost::multiprecision::number<Backend, ExpressionTemplates> & x)
 
   44         return x.template convert_to<Scalar>();
 
   50 #ifndef BOOST_MP_EIGEN_HPP 
   58   template<
class Backend, boost::multiprecision::expression_
template_option ExpressionTemplates>
 
   59   struct NumTraits<boost::multiprecision::number<Backend, ExpressionTemplates>>
 
   61     typedef boost::multiprecision::number<Backend, ExpressionTemplates> 
self_type;
 
   62   #if BOOST_VERSION / 100 % 1000 >= 68 
   73   #if BOOST_VERSION / 100 % 1000 >= 68 
   74       IsComplex = boost::multiprecision::number_category<self_type>::value
 
   75                   == boost::multiprecision::number_kind_complex,
 
   79       IsInteger = boost::multiprecision::number_category<self_type>::value
 
   80                   == boost::multiprecision::number_kind_integer,
 
   84       IsSigned = std::numeric_limits<self_type>::is_specialized
 
   85                    ? std::numeric_limits<self_type>::is_signed
 
   87       RequireInitialization = 1
 
   91       return std::numeric_limits<Real>::epsilon();
 
   95       return 1000 * epsilon();
 
  107       return std::numeric_limits<Real>::digits10;
 
  112       return static_cast<int>(Real::default_precision());
 
  118           std::numeric_limits<Real>::digits10 && (std::numeric_limits<Real>::digits10 != INT_MAX)
 
  128   #if EIGEN_VERSION_AT_LEAST(3, 4, 90) 
  129     constexpr 
static inline int max_digits10()
 
  136   template<
class tag, 
class Arg1, 
class Arg2, 
class Arg3, 
class Arg4>
 
  137   struct NumTraits<
boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>>
 
  139       typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>
 
  143   #if EIGEN_VERSION_AT_LEAST(3, 4, 90) 
  148     template<
class Backend, boost::multiprecision::expression_
template_option ExpressionTemplates>
 
  149     struct random_default_impl<
 
  150       boost::multiprecision::number<Backend, ExpressionTemplates>,
 
  154       typedef boost::multiprecision::number<Backend, ExpressionTemplates> 
Scalar;
 
  168   #if EIGEN_VERSION_AT_LEAST(3, 2, 93) 
  169     #define BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(A)                                                   \ 
  171         class Backend, boost::multiprecision::expression_template_option ExpressionTemplates,      \ 
  173       struct ScalarBinaryOpTraits<                                                                 \ 
  174         boost::multiprecision::number<Backend, ExpressionTemplates>, A, BinaryOp>                  \ 
  179         typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;            \ 
  182         class Backend, boost::multiprecision::expression_template_option ExpressionTemplates,      \ 
  184       struct ScalarBinaryOpTraits<                                                                 \ 
  185         A, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp>                  \ 
  190         typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;            \ 
  193   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
float)
 
  194   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
double)
 
  195   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
long double)
 
  196   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
char)
 
  197   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
unsigned char)
 
  198   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
signed char)
 
  199   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
short)
 
  200   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
unsigned short)
 
  201   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
int)
 
  202   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
unsigned int)
 
  203   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
long)
 
  204   BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(
unsigned long)
 
  208     boost::multiprecision::expression_template_option ExpressionTemplates,
 
  215   struct ScalarBinaryOpTraits<
 
  216     boost::multiprecision::number<Backend, ExpressionTemplates>,
 
  217     boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>,
 
  221       boost::is_convertible<
 
  222         typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::
 
  224         boost::multiprecision::number<Backend, ExpressionTemplates>>::value,
 
  225       "Interoperability with this arithmetic type is not supported.");
 
  226     typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;
 
  236     boost::multiprecision::expression_template_option ExpressionTemplates,
 
  238   struct ScalarBinaryOpTraits<
 
  239     boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>,
 
  240     boost::multiprecision::number<Backend, ExpressionTemplates>,
 
  244       boost::is_convertible<
 
  245         typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::
 
  247         boost::multiprecision::number<Backend, ExpressionTemplates>>::value,
 
  248       "Interoperability with this arithmetic type is not supported.");
 
  249     typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType;
 
  258       boost::multiprecision::expression_template_option ExpressionTemplates,
 
  264     struct scalar_product_traits<
 
  265       boost::multiprecision::number<Backend, ExpressionTemplates>,
 
  266       boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>>
 
  269         boost::is_convertible<
 
  270           typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::
 
  272           boost::multiprecision::number<Backend, ExpressionTemplates>>::
value,
 
  273         "Interoperability with this arithmetic type is not supported.");
 
  274       typedef boost::multiprecision::number<Backend, ExpressionTemplates> 
ReturnType;
 
  284       boost::multiprecision::expression_template_option ExpressionTemplates>
 
  285     struct scalar_product_traits<
 
  286       boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>,
 
  287       boost::multiprecision::number<Backend, ExpressionTemplates>>
 
  290         boost::is_convertible<
 
  291           typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::
 
  293           boost::multiprecision::number<Backend, ExpressionTemplates>>::
value,
 
  294         "Interoperability with this arithmetic type is not supported.");
 
  295       typedef boost::multiprecision::number<Backend, ExpressionTemplates> 
ReturnType;
 
  298     template<
typename Scalar>
 
  301     template<
typename Scalar, 
bool IsComplex>
 
  302   #if EIGEN_VERSION_AT_LEAST(3, 3, 9) 
  303     struct conj_default_impl;
 
  308     template<
class tag, 
class Arg1, 
class Arg2, 
class Arg3, 
class Arg4>
 
  312         typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type
 
  316     template<
class tag, 
class Arg1, 
class Arg2, 
class Arg3, 
class Arg4>
 
  317   #if EIGEN_VERSION_AT_LEAST(3, 3, 9) 
  318     struct conj_default_impl<
 
  319       boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>,
 
  322     struct 
conj_impl<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, true>
 
  325   #if EIGEN_VERSION_AT_LEAST(3, 2, 90) 
  329         typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type
 
  331           const typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> & x)
 
  341 #endif // ifndef BOOST_MP_EIGEN_HPP 
  343 #endif // ifndef __pinocchio_math_mutliprecision_hpp__