// (C) Copyright John Maddock 2005-2006. | |
// Use, modification and distribution are subject to the | |
// Boost Software License, Version 1.0. (See accompanying file | |
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
#ifndef BOOST_MATH_TOOLS_STATS_INCLUDED | |
#define BOOST_MATH_TOOLS_STATS_INCLUDED | |
#ifdef _MSC_VER | |
#pragma once | |
#endif | |
#include <boost/config/no_tr1/cmath.hpp> | |
#include <boost/cstdint.hpp> | |
#include <boost/math/tools/precision.hpp> | |
namespace boost{ namespace math{ namespace tools{ | |
template <class T> | |
class stats | |
{ | |
public: | |
stats() | |
: m_min(tools::max_value<T>()), | |
m_max(-tools::max_value<T>()), | |
m_total(0), | |
m_squared_total(0), | |
m_count(0) | |
{} | |
void add(const T& val) | |
{ | |
if(val < m_min) | |
m_min = val; | |
if(val > m_max) | |
m_max = val; | |
m_total += val; | |
++m_count; | |
m_squared_total += val*val; | |
} | |
T min BOOST_PREVENT_MACRO_SUBSTITUTION()const{ return m_min; } | |
T max BOOST_PREVENT_MACRO_SUBSTITUTION()const{ return m_max; } | |
T total()const{ return m_total; } | |
T mean()const{ return m_total / static_cast<T>(m_count); } | |
boost::uintmax_t count()const{ return m_count; } | |
T variance()const | |
{ | |
BOOST_MATH_STD_USING | |
T t = m_squared_total - m_total * m_total / m_count; | |
t /= m_count; | |
return t; | |
} | |
T variance1()const | |
{ | |
BOOST_MATH_STD_USING | |
T t = m_squared_total - m_total * m_total / m_count; | |
t /= (m_count-1); | |
return t; | |
} | |
T rms()const | |
{ | |
BOOST_MATH_STD_USING | |
return sqrt(m_squared_total / static_cast<T>(m_count)); | |
} | |
stats& operator+=(const stats& s) | |
{ | |
if(s.m_min < m_min) | |
m_min = s.m_min; | |
if(s.m_max > m_max) | |
m_max = s.m_max; | |
m_total += s.m_total; | |
m_squared_total += s.m_squared_total; | |
m_count += s.m_count; | |
return *this; | |
} | |
private: | |
T m_min, m_max, m_total, m_squared_total; | |
boost::uintmax_t m_count; | |
}; | |
} // namespace tools | |
} // namespace math | |
} // namespace boost | |
#endif | |