From 7f2e52f6a6978ae66637034eee3bafea87aaf8d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Mon, 2 Sep 2019 17:55:47 +0200 Subject: [PATCH] [apps/proba] Fix result consistency Scenario: Poisson distribution, lambda = 4, P(x < ?) = 1.3E-112 --- apps/probability/calculation/left_integral_calculation.cpp | 2 ++ apps/probability/calculation/right_integral_calculation.cpp | 2 ++ apps/probability/distribution/distribution.cpp | 6 +++--- poincare/src/solver.cpp | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/probability/calculation/left_integral_calculation.cpp b/apps/probability/calculation/left_integral_calculation.cpp index 7af5ff214..f589ce4e8 100644 --- a/apps/probability/calculation/left_integral_calculation.cpp +++ b/apps/probability/calculation/left_integral_calculation.cpp @@ -50,10 +50,12 @@ void LeftIntegralCalculation::compute(int indexKnownElement) { if (!std::isnan(m_upperBound)) { double currentResult = m_distribution->cumulativeDistributiveFunctionAtAbscissa(m_upperBound); if (std::fabs(currentResult - m_result) < std::pow(10.0, - Poincare::Preferences::LargeNumberOfSignificantDigits)) { + m_result = currentResult; return; } } m_upperBound = m_distribution->cumulativeDistributiveInverseForProbability(&m_result); + m_result = m_distribution->cumulativeDistributiveFunctionAtAbscissa(m_upperBound); if (std::isnan(m_upperBound)) { m_result = NAN; } diff --git a/apps/probability/calculation/right_integral_calculation.cpp b/apps/probability/calculation/right_integral_calculation.cpp index 5e7160606..08903df47 100644 --- a/apps/probability/calculation/right_integral_calculation.cpp +++ b/apps/probability/calculation/right_integral_calculation.cpp @@ -50,10 +50,12 @@ void RightIntegralCalculation::compute(int indexKnownElement) { if (m_distribution->authorizedValueAtIndex(m_lowerBound, 0)) { double currentResult = m_distribution->rightIntegralFromAbscissa(m_lowerBound); if (std::fabs(currentResult - m_result) < std::pow(10.0, - Poincare::Preferences::LargeNumberOfSignificantDigits)) { + m_result = currentResult; return; } } m_lowerBound = m_distribution->rightIntegralInverseForProbability(&m_result); + m_result = m_distribution->rightIntegralFromAbscissa(m_lowerBound); if (std::isnan(m_lowerBound)) { m_result = NAN; } diff --git a/apps/probability/distribution/distribution.cpp b/apps/probability/distribution/distribution.cpp index 8379a94a5..090ce3e90 100644 --- a/apps/probability/distribution/distribution.cpp +++ b/apps/probability/distribution/distribution.cpp @@ -49,14 +49,14 @@ double Distribution::finiteIntegralBetweenAbscissas(double a, double b) const { } double Distribution::cumulativeDistributiveInverseForProbability(double * probability) { - if (*probability >= 1.0) { + if (*probability > 1.0 - DBL_EPSILON) { return INFINITY; } if (isContinuous()) { return 0.0; } - if (*probability <= 0.0) { - return 0.0; + if (*probability < DBL_EPSILON) { + return -1.0; } return Poincare::Solver::CumulativeDistributiveInverseForNDefinedFunction(probability, [](double k, Poincare::Context * context, Poincare::Preferences::ComplexFormat complexFormat, Poincare::Preferences::AngleUnit angleUnit, const void * context1, const void * context2, const void * context3) { diff --git a/poincare/src/solver.cpp b/poincare/src/solver.cpp index 08580bab1..4ac77a0a6 100644 --- a/poincare/src/solver.cpp +++ b/poincare/src/solver.cpp @@ -208,7 +208,7 @@ Coordinate2D Solver::IncreasingFunctionRoot(double ax, double bx, double template T Solver::CumulativeDistributiveInverseForNDefinedFunction(T * probability, ValueAtAbscissa evaluation, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, const void * context1, const void * context2, const void * context3) { T precision = sizeof(T) == sizeof(double) ? DBL_EPSILON : FLT_EPSILON; - assert(*probability <= (((T)1.0) - precision) && *probability > precision); + assert(*probability <= (((T)1.0) - precision) && *probability >= precision); T p = 0.0; int k = 0; T delta = 0.0;