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 (at) 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> 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> 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> 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> 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> 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