Skip to content

Instantly share code, notes, and snippets.

@samueljackson92
Created June 11, 2013 19:57
Show Gist options
  • Save samueljackson92/5760075 to your computer and use it in GitHub Desktop.
Save samueljackson92/5760075 to your computer and use it in GitHub Desktop.
Accurately compute variance and standard deviation in one pass. Source: http://www.johndcook.com/blog/2013/06/11/computing-skewness-and-kurtosis-in-one-pass/
class RunningStat
{
public:
RunningStat() : m_n(0) {}
void Clear()
{
m_n = 0;
}
void Push(double x)
{
m_n++;
// See Knuth TAOCP vol 2, 3rd edition, page 232
if (m_n == 1)
{
m_oldM = m_newM = x;
m_oldS = 0.0;
}
else
{
m_newM = m_oldM + (x - m_oldM)/m_n;
m_newS = m_oldS + (x - m_oldM)*(x - m_newM);
// set up for next iteration
m_oldM = m_newM;
m_oldS = m_newS;
}
}
int NumDataValues() const
{
return m_n;
}
double Mean() const
{
return (m_n > 0) ? m_newM : 0.0;
}
double Variance() const
{
return ( (m_n > 1) ? m_newS/(m_n - 1) : 0.0 );
}
double StandardDeviation() const
{
return sqrt( Variance() );
}
private:
int m_n;
double m_oldM, m_newM, m_oldS, m_newS;
};
int main()
{
RunningStat rs;
rs.Push(17.0);
rs.Push(19.0);
rs.Push(24.0);
double mean = rs.Mean();
double variance = rs.Variance();
double stdev = rs.StandardDeviation();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment