NAG Library Manual, Mark 28.5
```/* nag::ad::c05ay Tangent Example Program.
*/

#include <dco.hpp>
#include <iostream>

// Function which calls NAG AD Library routines.
template <typename T> void func(T r, T &x);

// Driver with the tangent calls.
// Finds the zero point f(xv) = 0 for the function
// f(x) =  exp(-x) - r*x.
// Also, computes the gradient dxdr = dxv/dr.
void driver(const double &rv, double &xv, double &dxdr);

int main()
{
std::cout << " nag::ad::c05ay Tangent Example Program Results\n";

// Set problem parameters
double rv = 2.0;
// Solution x
double xv;
// Derivative of x
double dxdr;

// Call driver
driver(rv, xv, dxdr);

// Print outputs
std::cout << "\n Derivatives calculated: First order tangents\n";

// Print derivatives
std::cout.setf(std::ios::scientific, std::ios::floatfield);
std::cout.precision(12);
std::cout << "\n Solution:\n";
std::cout << " x = " << xv << std::endl;
std::cout << "\n Derivative of solution x w.r.t. parameter r:\n";
std::cout << " dx/dr(x) = " << dxdr << std::endl;

return 0;
}

// Driver with the tangent calls.
// Finds the zero point f(xv) = 0 for the function
// f(x) =  exp(-x) - r*x.
// Also, computes the gradient dxdr = dxv/dr.
void driver(const double &rv, double &xv, double &dxdr)
{
using T = dco::gt1s<double>::type;

// Function parameter r
T r = rv;
// Initialize tangent of r
dco::derivative(r) = 1.0;
// Variable to differentiate
T x;

// Call the NAG AD Lib functions
func(r, x);

// Extract the computed solution
xv = dco::value(x);
// Extract the derivatives
dxdr = dco::derivative(x);
}

// Function which calls NAG AD Library routines.
template <typename T> void func(T r, T &x)
{
// Active variables
T a = 0.0, b = 1.0;
T eps = 1.0e-5, eta = 0.0;
// Create AD configuration data object
Integer           ifail = 0;