pinocchio  2.1.3
sincos.hpp
1 //
2 // Copyright (c) 2015-2018 CNRS INRIA
3 // Copyright (c) 2015 Wandercraft, 86 rue de Paris 91400 Orsay, France.
4 //
5 
6 #ifndef __math_sincos_hpp__
7 #define __math_sincos_hpp__
8 
9 #include "pinocchio/fwd.hpp"
10 #include <cmath>
11 
12 namespace pinocchio
13 {
15  template<typename Scalar> struct SINCOSAlgo;
16 
17 
27  template<typename Scalar>
28  void SINCOS(const Scalar & a, Scalar * sa, Scalar * ca)
29  {
30  SINCOSAlgo<Scalar>::run(a,sa,ca);
31  }
32 
34  template<typename Scalar>
35  struct SINCOSAlgo
36  {
37  static void run(const Scalar & a, Scalar * sa, Scalar * ca)
38  {
39  (*sa) = std::sin(a); (*ca) = std::cos(a);
40  }
41  };
42 
44  template<>
45  struct SINCOSAlgo<double>
46  {
47  static void run(const double & a, double * sa, double * ca)
48  {
49 #ifdef __linux__
50  sincos(a,sa,ca);
51 #elif __APPLE__
52  __sincos(a,sa,ca);
53 #else // if sincos specialization does not exist
54  (*sa) = std::sin(a); (*ca) = std::cos(a);
55 #endif
56  }
57  };
58 
60  template<>
61  struct SINCOSAlgo<float>
62  {
63  static void run(const float & a, float * sa, float * ca)
64  {
65 #ifdef __linux__
66  sincosf(a,sa,ca);
67 #elif __APPLE__
68  __sincosf(a,sa,ca);
69 #else // if sincosf specialization does not exist
70  (*sa) = std::sin(a); (*ca) = std::cos(a);
71 #endif
72  }
73  };
74 
76  template<>
77  struct SINCOSAlgo<long double>
78  {
79  static void run(const long double & a, long double * sa, long double * ca)
80  {
81 #ifdef __linux__
82  sincosl(a,sa,ca);
83 #else // if sincosl specialization does not exist
84  (*sa) = std::sin(a); (*ca) = std::cos(a);
85 #endif
86  }
87  };
88 
89 #ifdef PINOCCHIO_WITH_CPPAD_SUPPORT
90 
92  template<typename Scalar>
93  struct SINCOSAlgo< CppAD::AD<Scalar> >
94  {
95  static void run(const CppAD::AD<Scalar> & a, CppAD::AD<Scalar> * sa, CppAD::AD<Scalar> * ca)
96  {
97  (*sa) = CppAD::sin(a); (*ca) = CppAD::cos(a);
98  }
99  };
100 
101 #endif
102 
103 }
104 
105 #endif //#ifndef __math_sincos_hpp__
Forward declaration.
Definition: sincos.hpp:15
void SINCOS(const Scalar &a, Scalar *sa, Scalar *ca)
Computes sin/cos values of a given input scalar.
Definition: sincos.hpp:28
Source from #include <cppad/example/cppad_eigen.hpp>
Definition: cppad.hpp:98
Main pinocchio namespace.
Definition: treeview.dox:24