Add a simple statistics calculator utility
This commit is contained in:
parent
0e5759f1c6
commit
5830977e45
1 changed files with 87 additions and 0 deletions
87
libs/util/include/psemek/util/statistics.hpp
Normal file
87
libs/util/include/psemek/util/statistics.hpp
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
#pragma once
|
||||
|
||||
#include <cmath>
|
||||
#include <limits>
|
||||
|
||||
namespace psemek::util
|
||||
{
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template <typename T>
|
||||
constexpr T min()
|
||||
{
|
||||
if constexpr (std::is_floating_point_v<T>)
|
||||
{
|
||||
return -std::numeric_limits<T>::infinity();
|
||||
}
|
||||
else
|
||||
{
|
||||
return std::numeric_limits<T>::min();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
constexpr T max()
|
||||
{
|
||||
if constexpr (std::is_floating_point_v<T>)
|
||||
{
|
||||
return std::numeric_limits<T>::infinity();
|
||||
}
|
||||
else
|
||||
{
|
||||
return std::numeric_limits<T>::max();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
struct statistics
|
||||
{
|
||||
void push(T const & value);
|
||||
|
||||
T mean() const;
|
||||
T var() const;
|
||||
T min() const { return min_; }
|
||||
T max() const { return max_; }
|
||||
|
||||
private:
|
||||
std::size_t count_ = 0;
|
||||
T sum_ = T{0};
|
||||
T sum_sqr_ = T{0};
|
||||
T min_ = detail::max<T>();
|
||||
T max_ = detail::min<T>();
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
void statistics<T>::push(T const & value)
|
||||
{
|
||||
++count_;
|
||||
sum_ += value;
|
||||
sum_sqr_ += value * value;
|
||||
min_ = std::min(min_, value);
|
||||
max_ = std::max(max_, value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T statistics<T>::mean() const
|
||||
{
|
||||
return sum_ / count_;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T statistics<T>::var() const
|
||||
{
|
||||
T const m = mean();
|
||||
return std::sqrt(sum_sqr_ / count_ - m * m);
|
||||
}
|
||||
|
||||
template <typename OStream, typename T>
|
||||
OStream & operator << (OStream & os, statistics<T> const & s)
|
||||
{
|
||||
return os << "mean = " << s.mean() << ", var = " << s.var() << ", range = [" << s.min() << " .. " << s.max() << "]";
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue