exp_eps

View page source

An Epsilon Accurate Exponential Approximation

Syntax

# include "exp_eps.hpp"

y = exp_eps ( x , epsilon )

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{eqnarray} {\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{eqnarray}

include

The include command in the syntax is relative to

cppad- yyyymmdd / introduction/exp_apx

where cppad- yyyymmdd 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

Type u = v

Type

construct u with value equal to v

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.

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 ?