diff options
-rw-r--r-- | AK/Statistics.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/AK/Statistics.h b/AK/Statistics.h new file mode 100644 index 0000000000..f8063caa87 --- /dev/null +++ b/AK/Statistics.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/Math.h> +#include <AK/QuickSort.h> +#include <AK/StdLibExtraDetails.h> +#include <AK/Vector.h> + +namespace AK { + +template<typename T = float> +requires(IsArithmetic<T>) class Statistics { +public: + Statistics() = default; + ~Statistics() = default; + + void add(T const& value) + { + // FIXME: Check for an overflow + m_sum += value; + m_values.append(value); + } + + T const sum() const { return m_sum; } + float average() const { return (float)sum() / size(); } + + // FIXME: Implement a better algorithm + T const median() + { + quick_sort(m_values); + return m_values.at(size() / 2); + } + + float standard_deviation() const { return sqrt(variance()); } + float variance() const + { + float summation = 0; + float avg = average(); + for (T number : values()) { + float difference = (float)number - avg; + summation += (difference * difference); + } + summation = summation / size(); + return summation; + } + + Vector<T> const& values() const { return m_values; } + size_t size() const { return m_values.size(); } + +private: + Vector<T> m_values; + T m_sum {}; +}; + +} |