diff --git a/ApplicationCode/ReservoirDataModel/ReservoirDataModel_UnitTests/RigStatisticsMath-Test.cpp b/ApplicationCode/ReservoirDataModel/ReservoirDataModel_UnitTests/RigStatisticsMath-Test.cpp index e8e04cf3b3..1be15da9bc 100644 --- a/ApplicationCode/ReservoirDataModel/ReservoirDataModel_UnitTests/RigStatisticsMath-Test.cpp +++ b/ApplicationCode/ReservoirDataModel/ReservoirDataModel_UnitTests/RigStatisticsMath-Test.cpp @@ -175,10 +175,8 @@ TEST(RigStatisticsMath, InterpolatedPercentiles) pValPos.push_back(90); std::vector pVals = RigStatisticsMath::calculateInterpolatedPercentiles(values, pValPos); - /* - EXPECT_DOUBLE_EQ( -76092.8157632591000, pVals[0]); - EXPECT_DOUBLE_EQ( 2788.2723335651900 , pVals[1]); - EXPECT_DOUBLE_EQ( 6391.979999097290 , pVals[2]); - EXPECT_DOUBLE_EQ( 96161.7546348456000 , pVals[3]); - */ + EXPECT_DOUBLE_EQ( -72278.340409937548, pVals[0]); + EXPECT_DOUBLE_EQ( -2265.6006907818719, pVals[1]); + EXPECT_DOUBLE_EQ( 6391.9799990972897, pVals[2]); + EXPECT_DOUBLE_EQ( 93073.49128098879, pVals[3]); } diff --git a/ApplicationCode/ReservoirDataModel/RigStatisticsMath.cpp b/ApplicationCode/ReservoirDataModel/RigStatisticsMath.cpp index 350115dfd7..a6148b98ee 100644 --- a/ApplicationCode/ReservoirDataModel/RigStatisticsMath.cpp +++ b/ApplicationCode/ReservoirDataModel/RigStatisticsMath.cpp @@ -142,22 +142,22 @@ std::vector RigStatisticsMath::calculateInterpolatedPercentiles(const st { double pVal = HUGE_VAL; - double doubleIndex = sortedValues.size() * fabs(pValPositions[i]) / 100.0; + double doubleIndex = (sortedValues.size() - 1) * fabs(pValPositions[i]) / 100.0; size_t lowerValueIndex = static_cast(floor(doubleIndex)); size_t upperValueIndex = lowerValueIndex + 1; - if (lowerValueIndex >= sortedValues.size() ) lowerValueIndex = sortedValues.size() - 1; - if (upperValueIndex >= sortedValues.size() ) upperValueIndex = sortedValues.size() - 1; + double upperValueWeight = doubleIndex - lowerValueIndex; + assert(upperValueWeight < 1.0); - double upperValueWeight = 1.0; - if (lowerValueIndex != upperValueIndex) + if (upperValueIndex < sortedValues.size()) { - upperValueWeight = doubleIndex - lowerValueIndex; - assert(upperValueWeight < 1.0); + pVal = (1.0 - upperValueWeight) * sortedValues[lowerValueIndex] + upperValueWeight * sortedValues[upperValueIndex]; + } + else + { + pVal = sortedValues[lowerValueIndex]; } - - pVal = (1.0 - upperValueWeight) * sortedValues[lowerValueIndex] + upperValueWeight * sortedValues[upperValueIndex]; percentiles[i] = pVal; } }