1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2010, 2013 Jitse Niesen <jitse@maths.leeds.ac.uk>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10 #ifndef EIGEN_STEM_FUNCTION
11 #define EIGEN_STEM_FUNCTION
12
13 namespace Eigen {
14
15 namespace internal {
16
17 /** \brief The exponential function (and its derivatives). */
18 template <typename Scalar>
stem_function_exp(Scalar x,int)19 Scalar stem_function_exp(Scalar x, int)
20 {
21 using std::exp;
22 return exp(x);
23 }
24
25 /** \brief Cosine (and its derivatives). */
26 template <typename Scalar>
stem_function_cos(Scalar x,int n)27 Scalar stem_function_cos(Scalar x, int n)
28 {
29 using std::cos;
30 using std::sin;
31 Scalar res;
32
33 switch (n % 4) {
34 case 0:
35 res = std::cos(x);
36 break;
37 case 1:
38 res = -std::sin(x);
39 break;
40 case 2:
41 res = -std::cos(x);
42 break;
43 case 3:
44 res = std::sin(x);
45 break;
46 }
47 return res;
48 }
49
50 /** \brief Sine (and its derivatives). */
51 template <typename Scalar>
stem_function_sin(Scalar x,int n)52 Scalar stem_function_sin(Scalar x, int n)
53 {
54 using std::cos;
55 using std::sin;
56 Scalar res;
57
58 switch (n % 4) {
59 case 0:
60 res = std::sin(x);
61 break;
62 case 1:
63 res = std::cos(x);
64 break;
65 case 2:
66 res = -std::sin(x);
67 break;
68 case 3:
69 res = -std::cos(x);
70 break;
71 }
72 return res;
73 }
74
75 /** \brief Hyperbolic cosine (and its derivatives). */
76 template <typename Scalar>
stem_function_cosh(Scalar x,int n)77 Scalar stem_function_cosh(Scalar x, int n)
78 {
79 using std::cosh;
80 using std::sinh;
81 Scalar res;
82
83 switch (n % 2) {
84 case 0:
85 res = std::cosh(x);
86 break;
87 case 1:
88 res = std::sinh(x);
89 break;
90 }
91 return res;
92 }
93
94 /** \brief Hyperbolic sine (and its derivatives). */
95 template <typename Scalar>
stem_function_sinh(Scalar x,int n)96 Scalar stem_function_sinh(Scalar x, int n)
97 {
98 using std::cosh;
99 using std::sinh;
100 Scalar res;
101
102 switch (n % 2) {
103 case 0:
104 res = std::sinh(x);
105 break;
106 case 1:
107 res = std::cosh(x);
108 break;
109 }
110 return res;
111 }
112
113 } // end namespace internal
114
115 } // end namespace Eigen
116
117 #endif // EIGEN_STEM_FUNCTION
118