Ref T261, aircraft changes class reflecting delta/average values

* math utils for standard deviation etc.
* CAircraftSituationChange value class
This commit is contained in:
Klaus Basan
2018-04-27 02:27:03 +02:00
committed by Roland Winklmeier
parent d1f5635bd1
commit 784cf29af5
7 changed files with 514 additions and 7 deletions

View File

@@ -8,6 +8,7 @@
*/
#include "blackmisc/math/mathutils.h"
#include "blackmisc/verify.h"
#include <QThreadStorage>
#include <QTime>
@@ -110,6 +111,13 @@ namespace BlackMisc
return r % ((high + 1) - low) + low;
}
double CMathUtils::randomDouble(double max)
{
static const int MAX(INT_MAX);
const double r = randomInteger(0, MAX);
return (r / MAX) * max;
}
int CMathUtils::roundToMultipleOf(int value, int divisor)
{
Q_ASSERT(divisor != 0);
@@ -136,5 +144,55 @@ namespace BlackMisc
if (fInt.length() >= width) { return fInt.left(width); }
return fInt.leftJustified(width, '0');
}
double CMathUtils::sum(const QList<double> &values)
{
double sum = 0;
for (double v : values) { sum += v; }
return sum;
}
QList<double> CMathUtils::squaredDifferences(const QList<double> &values)
{
const double meanValue = mean(values);
return squaredDifferences(values, meanValue);
}
QList<double> CMathUtils::squaredDifferences(const QList<double> &values, double meanValue)
{
QList<double> squaresDifferences;
for (double v : values)
{
const double vd = v - meanValue;
squaresDifferences.push_back(vd * vd);
}
return squaresDifferences;
}
double CMathUtils::mean(const QList<double> &values)
{
BLACK_VERIFY_X(!values.isEmpty(), Q_FUNC_INFO, "Need values");
return sum(values) / values.size();
}
double CMathUtils::variance(const QList<double> &values)
{
const double variance = mean(squaredDifferences(values));
return variance;
}
double CMathUtils::standardDeviation(const QList<double> &values)
{
const double sd = sqrt(variance(values));
return sd;
}
QPair<double, double> CMathUtils::standardDeviationAndMean(const QList<double> &values)
{
const double meanValue = mean(values);
const double varianceValue = mean(squaredDifferences(values, meanValue));
const double sd = sqrt(varianceValue);
return QPair<double, double>(sd, meanValue);
}
} // namespace
} // namespace

View File

@@ -15,6 +15,7 @@
#include "blackmisc/blackmiscexport.h"
#include <QtCore/qmath.h>
#include <QPair>
#include <cmath>
namespace BlackMisc
@@ -25,7 +26,6 @@ namespace BlackMisc
class BLACKMISC_EXPORT CMathUtils
{
public:
//! No objects, just static
CMathUtils() = delete;
@@ -108,12 +108,37 @@ namespace BlackMisc
//! Random number between low and high
static int randomInteger(int low, int high);
//! Random double 0-max
static double randomDouble(double max = 1);
//! Round numToRound to the nearest multiple of divisor
static int roundToMultipleOf(int value, int divisor);
//! Fractional part as integer string, e.g. 3.12 -> 12 / 3.012 -> 012
//! \remark because of leading 0 returned as string
static QString fractionalPartAsString(double value, int width = -1);
//! Calculate the sum
static double sum(const QList<double> &values);
//! Calculate the mean
static double mean(const QList<double> &values);
//! Calculate the standard deviation
static double standardDeviation(const QList<double> &values);
//! Standard deviation (first) and mean (second)
static QPair<double, double> standardDeviationAndMean(const QList<double> &values);
private:
//! Calculate the variance
static double variance(const QList<double> &values);
//! The squared differences to mean
static QList<double> squaredDifferences(const QList<double> &values);
//! The squared differences to mean
static QList<double> squaredDifferences(const QList<double> &values, double meanValue);
};
} // namespace
} // namespace