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__