pinocchio  3.3.1
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
sincos.hpp
1 //
2 // Copyright (c) 2015-2020 CNRS INRIA
3 // Copyright (c) 2015 Wandercraft, 86 rue de Paris 91400 Orsay, France.
4 //
5 
6 #ifndef __pinocchio_math_sincos_hpp__
7 #define __pinocchio_math_sincos_hpp__
8 
9 #include <cmath>
10 
11 namespace pinocchio
12 {
13  // Forward declaration
14  template<typename S1, typename S2 = S1, typename S3 = S1>
15  struct SINCOSAlgo;
16 
26  template<typename S1, typename S2, typename S3>
27  void SINCOS(const S1 & a, S2 * sa, S3 * ca)
28  {
29  SINCOSAlgo<S1, S2, S3>::run(a, sa, ca);
30  }
31 
33  template<typename S1, typename S2, typename S3>
34  struct SINCOSAlgo
35  {
36  static void run(const S1 & a, S2 * sa, S3 * ca)
37  {
38  using std::cos;
39  using std::sin;
40  (*sa) = sin(a);
41  (*ca) = cos(a);
42  }
43  };
44 
46  template<>
47  struct SINCOSAlgo<double>
48  {
49  static void run(const double & a, double * sa, double * ca)
50  {
51 #ifdef __linux__
52  sincos(a, sa, ca);
53 #elif __APPLE__
54  __sincos(a, sa, ca);
55 #else // if sincos specialization does not exist
56  (*sa) = std::sin(a);
57  (*ca) = std::cos(a);
58 #endif
59  }
60  };
61 
63  template<>
64  struct SINCOSAlgo<float>
65  {
66  static void run(const float & a, float * sa, float * ca)
67  {
68 #ifdef __linux__
69  sincosf(a, sa, ca);
70 #elif __APPLE__
71  __sincosf(a, sa, ca);
72 #else // if sincosf specialization does not exist
73  (*sa) = std::sin(a);
74  (*ca) = std::cos(a);
75 #endif
76  }
77  };
78 
80  template<>
81  struct SINCOSAlgo<long double>
82  {
83  static void run(const long double & a, long double * sa, long double * ca)
84  {
85 #ifdef __linux__
86  sincosl(a, sa, ca);
87 #else // if sincosl specialization does not exist
88  (*sa) = std::sin(a);
89  (*ca) = std::cos(a);
90 #endif
91  }
92  };
93 
94 } // namespace pinocchio
95 
96 #endif // #ifndef __pinocchio_math_sincos_hpp__
Main pinocchio namespace.
Definition: treeview.dox:11
void SINCOS(const S1 &a, S2 *sa, S3 *ca)
Computes sin/cos values of a given input scalar.
Definition: sincos.hpp:27
Generic evaluation of sin/cos functions.
Definition: sincos.hpp:35