Loading...
Searching...
No Matches
juce_StatisticsAccumulator.h
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
//==============================================================================
template <typename FloatType>
class StatisticsAccumulator
{
public:
//==============================================================================
StatisticsAccumulator() = default;
//==============================================================================
void addValue (FloatType v) noexcept
{
jassert (juce_isfinite (v));
sum += v;
sumSquares += v * v;
++count;
if (v > maximum) maximum = v;
if (v < minimum) minimum = v;
}
void reset() noexcept { *this = StatisticsAccumulator<FloatType>(); }
//==============================================================================
FloatType getAverage() const noexcept
{
return count > 0 ? sum / (FloatType) count
: FloatType();
}
FloatType getVariance() const noexcept
{
return count > 0 ? (sumSquares - sum * sum / (FloatType) count) / (FloatType) count
: FloatType();
}
FloatType getStandardDeviation() const noexcept
{
return std::sqrt (getVariance());
}
FloatType getMinValue() const noexcept
{
return minimum;
}
FloatType getMaxValue() const noexcept
{
return maximum;
}
size_t getCount() const noexcept
{
return count;
}
private:
//==============================================================================
struct KahanSum
{
KahanSum() = default;
operator FloatType() const noexcept { return sum; }
void JUCE_NO_ASSOCIATIVE_MATH_OPTIMISATIONS operator+= (FloatType value) noexcept
{
FloatType correctedValue = value - error;
FloatType newSum = sum + correctedValue;
error = (newSum - sum) - correctedValue;
sum = newSum;
}
FloatType sum{}, error{};
};
//==============================================================================
size_t count { 0 };
KahanSum sum, sumSquares;
FloatType minimum { std::numeric_limits<FloatType>::infinity() },
maximum { -std::numeric_limits<FloatType>::infinity() };
};
} // namespace juce
juce::StatisticsAccumulator::StatisticsAccumulator
StatisticsAccumulator()=default
juce::StatisticsAccumulator::getMinValue
FloatType getMinValue() const noexcept
Definition juce_StatisticsAccumulator.h:92
juce::StatisticsAccumulator::getAverage
FloatType getAverage() const noexcept
Definition juce_StatisticsAccumulator.h:66
juce::StatisticsAccumulator::reset
void reset() noexcept
Definition juce_StatisticsAccumulator.h:60
juce::StatisticsAccumulator::getVariance
FloatType getVariance() const noexcept
Definition juce_StatisticsAccumulator.h:75
juce::StatisticsAccumulator::getCount
size_t getCount() const noexcept
Definition juce_StatisticsAccumulator.h:106
juce::StatisticsAccumulator::addValue
void addValue(FloatType v) noexcept
Definition juce_StatisticsAccumulator.h:45
juce::StatisticsAccumulator::getStandardDeviation
FloatType getStandardDeviation() const noexcept
Definition juce_StatisticsAccumulator.h:84
juce::StatisticsAccumulator::getMaxValue
FloatType getMaxValue() const noexcept
Definition juce_StatisticsAccumulator.h:100