Relative and Absolute Error

Routine Name(s): Relative and Absolute Error

Author: Kyle Hovey

Language: C++

Description/Purpose:

These templated functions are designed to calculate absolute and relative error when the exact form of a number is known. If we define \(v\) to be the exact amount and \(v_{\text{approx}}\) to be an approximation, then absolute error (\( \epsilon \)) is defined to be:

\[ \epsilon := \Big \lvert v - v_{\text{approx}} \Big \rvert \]

and relative error is defined to be:

\[ \eta := \frac{\epsilon}{\lvert v \rvert} \]

Input:

The first parameter will be the approximation, and the second parameter will be the exact value. A type is also specified in the template function.

Output:

Either the absolute or relative error, depending on the function call.

Usage/Example:

To use this function, you have to include it in the file you need to call it from.

#include "absolute_error/absolute_error.h"
#include "relative_error/relative_error.h"
#include <limits>
#include <iostream>

int main() {
  const double approx = 3.2;
  const double exact = M_PI;

  std::cout << "PI: " << exact << '\n';
  std::cout << "Approximation: " << approx << '\n';
  std::cout << "- - - - - - - - - -" << '\n';
  std::cout << "Absolute: " << absoluteError<double>(approx, exact) << '\n';
  std::cout << "Relative: " << relativeError<double>(approx, exact) << '\n';

  return EXIT_SUCCESS;
}

Output:

PI: 3.14159
Approximation: 3.2
- - - - - - - - - -
Absolute: 0.0584073
Relative: 0.0185916

Implementation/Code:

Computing absolute error is straightforward:

template <typename T>
/**
 * @param approximate The value that is approximated
 * @param exact The exact value to be compared against
 * @return The relative error
 */
T relativeError(const T approximate, const T exact) {
  return absoluteError<T>(approximate, exact) / exact;
}

Computing relative error utilizes the computation for absolute error:

template <typename T>
/**
 * @param approximate The value that is approximated
 * @param exact The exact value to be compared against
 * @return The relative error
 */
T relativeError(const T approximate, const T exact) {
  return absoluteError<T>(approximate, exact) / exact;
}