Prev Next

An Epsilon Accurate Exponential Approximation

Syntax
# include "exp_eps.hpp"
y = exp_eps(xepsilon)

Purpose
This is a an example algorithm that is used to demonstrate how Algorithmic Differentiation works with loops and boolean decision variables (see exp_2 for a simpler example).

Mathematical Function
The exponential function can be defined by  \[
     \exp (x) = 1 + x^1 / 1 ! + x^2 / 2 ! + \cdots 
\] 
We define  k ( x, \varepsilon )   as the smallest non-negative integer such that  \varepsilon \geq x^k / k ! ; i.e.,  \[
k( x, \varepsilon ) = 
     \min \{ k \in {\rm Z}_+ \; | \; \varepsilon \geq x^k / k ! \}
\] 
The mathematical form for our approximation of the exponential function is  \[
\begin{array}{rcl}
{\rm exp\_eps} (x , \varepsilon ) & = & \left\{
\begin{array}{ll}
\frac{1}{ {\rm exp\_eps} (-x , \varepsilon ) } 
     & {\rm if} \; x < 0 
\\
1 + x^1 / 1 ! + \cdots + x^{k( x, \varepsilon)} / k( x, \varepsilon ) !
     & {\rm otherwise}
\end{array}
\right.
\end{array}
\] 


include
The include command in the syntax is relative to
     cppad-
yy-mm-dd/introduction/exp_apx
where cppad-yy-mm-dd is the distribution directory created during the beginning steps of the installation of CppAD.

x
The argument x has prototype
     const 
Type &x
(see Type below). It specifies the point at which to evaluate the approximation for the exponential function.

epsilon
The argument epsilon has prototype
     const 
Type &epsilon
It specifies the accuracy with which to approximate the exponential function value; i.e., it is the value of  \varepsilon in the exponential function approximation defined above.

y
The result y has prototype
     
Type y
It is the value of the exponential function approximation defined above.

Type
If u and v are Type objects and i is an int:
Operation Result Type Description
Type(i) Type object with value equal to i
u > v bool true, if u greater than v, an false otherwise
u = v Type new u (and result) is value of v
u * v Type result is value of  u * v
u / v Type result is value of  u / v
u + v Type result is value of  u + v
-u Type result is value of  - u

Implementation
The file exp_eps.hpp contains a C++ implementation of this function.

Test
The file exp_eps.cpp contains a test of this implementation. It returns true for success and false for failure.

Exercises
  1. Using the definition of  k( x, \varepsilon ) above, what is the value of  k(.5, 1) ,  k(.5, .1) , and  k(.5, .01) ?
  2. Suppose that we make the following call to exp_eps:
         double x       = 1.;
         double epsilon = .01;
         double y = exp_eps(x, epsilon);
    What is the value assigned to k, temp, term, and sum the first time through the while loop in exp_eps.hpp ?
  3. Continuing the previous exercise, what is the value assigned to k, temp, term, and sum the second time through the while loop in exp_eps.hpp ?

Input File: introduction/exp_apx/exp_eps.hpp