• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2010 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 /** \ingroup MatrixFunctions_Module
16   * \brief Stem functions corresponding to standard mathematical functions.
17   */
18 template <typename Scalar>
19 class StdStemFunctions
20 {
21   public:
22 
23     /** \brief The exponential function (and its derivatives). */
exp(Scalar x,int)24     static Scalar exp(Scalar x, int)
25     {
26       return std::exp(x);
27     }
28 
29     /** \brief Cosine (and its derivatives). */
cos(Scalar x,int n)30     static Scalar cos(Scalar x, int n)
31     {
32       Scalar res;
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). */
sin(Scalar x,int n)51     static Scalar sin(Scalar x, int n)
52     {
53       Scalar res;
54       switch (n % 4) {
55       case 0:
56 	res = std::sin(x);
57 	break;
58       case 1:
59 	res = std::cos(x);
60 	break;
61       case 2:
62 	res = -std::sin(x);
63 	break;
64       case 3:
65 	res = -std::cos(x);
66 	break;
67       }
68       return res;
69     }
70 
71     /** \brief Hyperbolic cosine (and its derivatives). */
cosh(Scalar x,int n)72     static Scalar cosh(Scalar x, int n)
73     {
74       Scalar res;
75       switch (n % 2) {
76       case 0:
77 	res = std::cosh(x);
78 	break;
79       case 1:
80 	res = std::sinh(x);
81 	break;
82       }
83       return res;
84     }
85 
86     /** \brief Hyperbolic sine (and its derivatives). */
sinh(Scalar x,int n)87     static Scalar sinh(Scalar x, int n)
88     {
89       Scalar res;
90       switch (n % 2) {
91       case 0:
92 	res = std::sinh(x);
93 	break;
94       case 1:
95 	res = std::cosh(x);
96 	break;
97       }
98       return res;
99     }
100 
101 }; // end of class StdStemFunctions
102 
103 } // end namespace Eigen
104 
105 #endif // EIGEN_STEM_FUNCTION
106