ITK  5.0.0
Insight Segmentation and Registration Toolkit
Public Types | Public Member Functions | Private Attributes | List of all members
itk::CompensatedSummation< TFloat > Class Template Reference

#include <itkCompensatedSummation.h>

+ Inheritance diagram for itk::CompensatedSummation< TFloat >:
+ Collaboration diagram for itk::CompensatedSummation< TFloat >:

Detailed Description

template<typename TFloat>
class itk::CompensatedSummation< TFloat >

Perform more precise accumulation of floating point numbers.

The float and double datatypes only have finite precision. When performing a running sum of floats, the accumulated errors get progressively worse as the magnitude of the sum gets large relative to new elements.

From Wikipedia, http://en.wikipedia.org/wiki/Kahan_summation_algorithm

"In numerical analysis, the Kahan summation algorithm (also known as compensated summation) significantly reduces the numerical error in the total obtained by adding a sequence of finite precision floating point numbers, compared to the obvious approach. This is done by keeping a separate running compensation (a variable to accumulate small errors)."

For example, instead of

double sum = 0.0;
for( unsigned int i = 0; i < array.Size(); ++i )
{
sum += array.GetElement(i);
}

do

using CompensatedSummationType = CompensatedSummation<double>;
CompensatedSummationType compensatedSummation;
for( unsigned int i = 0; i < array.Size(); ++i )
{
compensatedSummation += array.GetElement(i);
}
double sum = compensatedSummation.GetSum();

Definition at line 66 of file itkCompensatedSummation.h.

Public Types

using AccumulateType = typename NumericTraits< FloatType >::AccumulateType
 
using FloatType = TFloat
 
using Self = CompensatedSummation
 

Public Member Functions

 CompensatedSummation (const Self &rhs)
 
const AccumulateTypeGetSum () const
 
 operator FloatType () const
 
Selfoperator-= (const FloatType &rhs)
 
Selfoperator= (const Self &rhs)
 
Selfoperator= (const FloatType &rhs)
 
void ResetToZero ()
 
 CompensatedSummation ()
 
 CompensatedSummation (FloatType value)
 
void AddElement (const FloatType &element)
 
Selfoperator+= (const FloatType &rhs)
 
Selfoperator+= (const Self &rhs)
 
Selfoperator*= (const FloatType &rhs)
 
Selfoperator/= (const FloatType &rhs)
 

Private Attributes

AccumulateType m_Compensation
 
AccumulateType m_Sum
 

Member Typedef Documentation

template<typename TFloat>
using itk::CompensatedSummation< TFloat >::AccumulateType = typename NumericTraits< FloatType >::AccumulateType

Type used for the sum and compensation.

Definition at line 73 of file itkCompensatedSummation.h.

template<typename TFloat>
using itk::CompensatedSummation< TFloat >::FloatType = TFloat

Type of the input elements.

Definition at line 70 of file itkCompensatedSummation.h.

template<typename TFloat>
using itk::CompensatedSummation< TFloat >::Self = CompensatedSummation

Standard class type aliases.

Definition at line 76 of file itkCompensatedSummation.h.

Constructor & Destructor Documentation

template<typename TFloat>
itk::CompensatedSummation< TFloat >::CompensatedSummation ( )

Constructors.

template<typename TFloat>
itk::CompensatedSummation< TFloat >::CompensatedSummation ( FloatType  value)

Constructors.

template<typename TFloat>
itk::CompensatedSummation< TFloat >::CompensatedSummation ( const Self rhs)

Copy constructor.

Member Function Documentation

template<typename TFloat>
void itk::CompensatedSummation< TFloat >::AddElement ( const FloatType element)

Add an element to the sum.

template<typename TFloat>
const AccumulateType& itk::CompensatedSummation< TFloat >::GetSum ( ) const

Get the sum.

template<typename TFloat>
itk::CompensatedSummation< TFloat >::operator FloatType ( ) const
explicit

explicit conversion

template<typename TFloat>
Self& itk::CompensatedSummation< TFloat >::operator*= ( const FloatType rhs)

Division and multiplication. These do not provide any numerical advantages relative to vanilla division and multiplication.

template<typename TFloat>
Self& itk::CompensatedSummation< TFloat >::operator+= ( const FloatType rhs)

Add an element to the sum.

template<typename TFloat>
Self& itk::CompensatedSummation< TFloat >::operator+= ( const Self rhs)

Add an element to the sum.

template<typename TFloat>
Self& itk::CompensatedSummation< TFloat >::operator-= ( const FloatType rhs)

Subtract an element from the sum.

template<typename TFloat>
Self& itk::CompensatedSummation< TFloat >::operator/= ( const FloatType rhs)

Division and multiplication. These do not provide any numerical advantages relative to vanilla division and multiplication.

template<typename TFloat>
Self& itk::CompensatedSummation< TFloat >::operator= ( const Self rhs)

Assignment operator.

template<typename TFloat>
Self& itk::CompensatedSummation< TFloat >::operator= ( const FloatType rhs)

Reset the sum to the given value and the compensation to zero.

template<typename TFloat>
void itk::CompensatedSummation< TFloat >::ResetToZero ( )

Reset the sum and compensation to zero.

Member Data Documentation

template<typename TFloat>
AccumulateType itk::CompensatedSummation< TFloat >::m_Compensation
private

Definition at line 118 of file itkCompensatedSummation.h.

template<typename TFloat>
AccumulateType itk::CompensatedSummation< TFloat >::m_Sum
private

Definition at line 117 of file itkCompensatedSummation.h.


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