GeographicLib::Accumulator< T > Class Template Reference

An accumulator for sums. More...

`#include <GeographicLib/Accumulator.hpp>`

## Public Member Functions

| Accumulator (T y=T(0))
Accumulator & | operator= (T y)
T | operator() () const
T | operator() (T y) const
Accumulator & | operator+= (T y)
Accumulator & | operator-= (T y)
Accumulator & | operator*= (int n)
Accumulator & | operator*= (T y)
Accumulator & | remainder (T y)
bool | operator== (T y) const
bool | operator!= (T y) const
bool | operator< (T y) const
bool | operator<= (T y) const
bool | operator> (T y) const
bool | operator>= (T y) const

## Detailed Description

template<typename T = Math::real>
class GeographicLib::Accumulator< T >

An accumulator for sums.

This allows many numbers of floating point type T to be added together with twice the normal precision. Thus if T is double, the effective precision of the sum is 106 bits or about 32 decimal places.

The implementation follows J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) 305–363 (1997).

Approximate timings (summing a vector<double>)

- double: 2ns
- Accumulator<double>: 23ns

In the documentation of the member functions, sum stands for the value currently held in the accumulator.

Example of use:

// Example of using the GeographicLib::Accumulator class
#include <iostream>
#include <exception>
#include <GeographicLib/Accumulator.hpp>
using namespace std;
using namespace GeographicLib;
int main() {
try {
// Compare using Accumulator and ordinary summation for a sum of large and
// small terms.
double sum = 0;
Accumulator<> acc = 0;
sum += 1e20; sum += 1; sum += 2; sum += 100; sum += 5000; sum += -1e20;
acc += 1e20; acc += 1; acc += 2; acc += 100; acc += 5000; acc += -1e20;
cout << sum << " " << acc() << "\n";
}
catch (const exception& e) {
cerr << "Caught exception: " << e.what() << "\n";
return 1;
}
}
Accumulator.hpp
Header for GeographicLib::Accumulator class.
main
int main(int argc, const char *const argv[])
Definition: CartConvert.cpp:29
GeographicLib
Namespace for GeographicLib.
Definition: Accumulator.cpp:12
std
Definition: NearestNeighbor.hpp:812

Definition at line 40 of file Accumulator.hpp.

## Constructor & Destructor Documentation

## Accumulator()

template<typename T = Math::real>

GeographicLib::Accumulator< T >::Accumulator | ( | T | y = `T(0)` | ) |

inline

Construct from a T. This is not declared explicit, so that you can write `Accumulator<double> a = 5;`.

Parameters

  [in] | y | set sum = y.

Definition at line 102 of file Accumulator.hpp.

## Member Function Documentation

## operator=()

template<typename T = Math::real>

Accumulator & GeographicLib::Accumulator< T >::operator= | ( | T | y | ) |

inline

Set the accumulator to a number.

Parameters

  [in] | y | set sum = y.

Definition at line 111 of file Accumulator.hpp.

## operator()() [1/2]

template<typename T = Math::real>

T GeographicLib::Accumulator< T >::operator() | ( |  | ) | const

inline

Return the value held in the accumulator.

Returns
  sum.

Definition at line 117 of file Accumulator.hpp.

## operator()() [2/2]

template<typename T = Math::real>

T GeographicLib::Accumulator< T >::operator() | ( | T | y | ) | const

inline

Return the result of adding a number to sum (but don't change sum).

Parameters

  [in] | y | the number to be added to the sum.

Returns
  sum + y.

Definition at line 125 of file Accumulator.hpp.

## operator+=()

template<typename T = Math::real>

Accumulator & GeographicLib::Accumulator< T >::operator+= | ( | T | y | ) |

inline

Add a number to the accumulator.

Parameters

  [in] | y | set sum += y.

Definition at line 131 of file Accumulator.hpp.

## operator-=()

template<typename T = Math::real>

Accumulator & GeographicLib::Accumulator< T >::operator-= | ( | T | y | ) |

inline

Subtract a number from the accumulator.

Parameters

  [in] | y | set sum -= y.

Definition at line 137 of file Accumulator.hpp.

## operator*=() [1/2]

template<typename T = Math::real>

Accumulator & GeographicLib::Accumulator< T >::operator*= | ( | int | n | ) |

inline

Multiply accumulator by an integer. To avoid loss of accuracy, use only integers such that n × T is exactly representable as a T (i.e., ± powers of two). Use n = −1 to negate sum.

Parameters

  [in] | n | set sum *= n.

Definition at line 145 of file Accumulator.hpp.

## operator*=() [2/2]

template<typename T = Math::real>

Accumulator & GeographicLib::Accumulator< T >::operator*= | ( | T | y | ) |

inline

Multiply accumulator by a number. The fma (fused multiply and add) instruction is used (if available) in order to maintain accuracy.

Parameters

  [in] | y | set sum *= y.

Definition at line 152 of file Accumulator.hpp.

## remainder()

template<typename T = Math::real>

Accumulator & GeographicLib::Accumulator< T >::remainder | ( | T | y | ) |

inline

Reduce accumulator to the range [-y/2, y/2].

Parameters

  [in] | y | the modulus.

Definition at line 164 of file Accumulator.hpp.

## operator==()

template<typename T = Math::real>

bool GeographicLib::Accumulator< T >::operator== | ( | T | y | ) | const

inline

Test equality of an Accumulator with a number.

Definition at line 173 of file Accumulator.hpp.

## operator!=()

template<typename T = Math::real>

bool GeographicLib::Accumulator< T >::operator!= | ( | T | y | ) | const

inline

Test inequality of an Accumulator with a number.

Definition at line 177 of file Accumulator.hpp.

## operator<()

template<typename T = Math::real>

bool GeographicLib::Accumulator< T >::operator< | ( | T | y | ) | const

inline

Less operator on an Accumulator and a number.

Definition at line 181 of file Accumulator.hpp.

## operator<=()

template<typename T = Math::real>

bool GeographicLib::Accumulator< T >::operator<= | ( | T | y | ) | const

inline

Less or equal operator on an Accumulator and a number.

Definition at line 185 of file Accumulator.hpp.

## operator>()

template<typename T = Math::real>

bool GeographicLib::Accumulator< T >::operator> | ( | T | y | ) | const

inline

Greater operator on an Accumulator and a number.

Definition at line 189 of file Accumulator.hpp.

## operator>=()

template<typename T = Math::real>

bool GeographicLib::Accumulator< T >::operator>= | ( | T | y | ) | const

inline

Greater or equal operator on an Accumulator and a number.

Definition at line 193 of file Accumulator.hpp.

The documentation for this class was generated from the following file:

- Accumulator.hpp