pinocchio  3.7.0
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
 
Loading...
Searching...
No Matches
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
11namespace 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 {
30 }
31
33 template<typename S1, typename S2, typename S3>
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<>
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<>
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<>
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