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