#3748 Statistics calculators : Improve handling of invalid numbers

This commit is contained in:
Magne Sjaastad 2018-11-23 10:13:58 +01:00
parent f9a6957fae
commit 200e6d229b
3 changed files with 33 additions and 37 deletions

View File

@ -42,7 +42,7 @@ void RigStatisticsMath::calculateBasicStatistics(const std::vector<double>& valu
for (size_t i = 0; i < values.size(); i++) for (size_t i = 0; i < values.size(); i++)
{ {
double val = values[i]; double val = values[i];
if (val == HUGE_VAL) continue; if (RiaStatisticsTools::isInvalidNumber<double>(val)) continue;
validValueCount++; validValueCount++;
@ -57,7 +57,6 @@ void RigStatisticsMath::calculateBasicStatistics(const std::vector<double>& valu
{ {
m_mean = m_sum / validValueCount; m_mean = m_sum / validValueCount;
// http://en.wikipedia.org/wiki/Standard_deviation#Rapid_calculation_methods // http://en.wikipedia.org/wiki/Standard_deviation#Rapid_calculation_methods
// Running standard deviation // Running standard deviation
@ -91,7 +90,7 @@ std::vector<double> RigStatisticsMath::calculateNearestRankPercentiles(const std
for (size_t i = 0; i < inputValues.size(); ++i) for (size_t i = 0; i < inputValues.size(); ++i)
{ {
if (inputValues[i] != HUGE_VAL) if (RiaStatisticsTools::isValidNumber<double>(inputValues[i]))
{ {
sortedValues.push_back(inputValues[i]); sortedValues.push_back(inputValues[i]);
} }
@ -130,7 +129,7 @@ std::vector<double> RigStatisticsMath::calculateInterpolatedPercentiles(const st
for (size_t i = 0; i < inputValues.size(); ++i) for (size_t i = 0; i < inputValues.size(); ++i)
{ {
if (inputValues[i] != HUGE_VAL) if (RiaStatisticsTools::isValidNumber<double>(inputValues[i]))
{ {
sortedValues.push_back(inputValues[i]); sortedValues.push_back(inputValues[i]);
} }
@ -195,10 +194,7 @@ RigHistogramCalculator::RigHistogramCalculator(double min, double max, size_t nB
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RigHistogramCalculator::addValue(double value) void RigHistogramCalculator::addValue(double value)
{ {
if (value == HUGE_VAL || value != value) if (RiaStatisticsTools::isInvalidNumber<double>(value)) return;
{
return;
}
size_t index = 0; size_t index = 0;
@ -262,5 +258,6 @@ double RigHistogramCalculator::calculatePercentil(double pVal)
} }
} }
assert(false); assert(false);
return HUGE_VAL; return HUGE_VAL;
} }

View File

@ -17,6 +17,8 @@
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
#pragma once #pragma once
#include "RiaStatisticsTools.h"
#include <vector> #include <vector>
#include <set> #include <set>
#include <cmath> #include <cmath>
@ -82,11 +84,8 @@ public:
void addValue(double value) void addValue(double value)
{ {
if (value == HUGE_VAL) // TODO if (RiaStatisticsTools::isValidNumber<double>(value))
{ {
return;
}
if (value < min) if (value < min)
{ {
min = value; min = value;
@ -97,6 +96,7 @@ public:
max = value; max = value;
} }
} }
}
double max; double max;
double min; double min;
@ -126,11 +126,8 @@ public:
void addValue(double value) void addValue(double value)
{ {
if (value == HUGE_VAL) if (RiaStatisticsTools::isValidNumber<double>(value))
{ {
return;
}
if (value < pos && value > 0) if (value < pos && value > 0)
{ {
pos = value; pos = value;
@ -141,6 +138,7 @@ public:
neg = value; neg = value;
} }
} }
}
double pos; double pos;
double neg; double neg;
@ -170,14 +168,12 @@ public:
void addValue(double value) void addValue(double value)
{ {
if (value == HUGE_VAL || value != value) if (RiaStatisticsTools::isValidNumber<double>(value))
{ {
return;
}
valueSum += value; valueSum += value;
++sampleCount; ++sampleCount;
} }
}
double valueSum; double valueSum;
size_t sampleCount; size_t sampleCount;
@ -207,9 +203,12 @@ public:
} }
void addValue(double value) void addValue(double value)
{
if (RiaStatisticsTools::isValidNumber<double>(value))
{ {
uniqueValues.insert(static_cast<int>(value)); uniqueValues.insert(static_cast<int>(value));
} }
}
std::set<int> uniqueValues; std::set<int> uniqueValues;
}; };

View File

@ -225,6 +225,6 @@ TEST(RigStatisticsMath, Accumulators)
EXPECT_FALSE(std::isinf(acc.valueSum)); EXPECT_FALSE(std::isinf(acc.valueSum));
EXPECT_DOUBLE_EQ(sum, acc.valueSum); EXPECT_DOUBLE_EQ(sum, acc.valueSum);
EXPECT_EQ(4, acc.sampleCount); EXPECT_EQ(4u, acc.sampleCount);
} }
} }