From 6ccabe2d3be4d949ab3e9e54cac95de2dbc2cbae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 20 Dec 2017 10:08:23 +0100 Subject: [PATCH] [apps] Probability: fix bug: for discrete laws, when inversing probability, round to the closest existing probability (instead of the closest smaller) --- apps/probability/law/law.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/probability/law/law.cpp b/apps/probability/law/law.cpp index 7fd44ecc6..3ec167a47 100644 --- a/apps/probability/law/law.cpp +++ b/apps/probability/law/law.cpp @@ -77,9 +77,12 @@ double Law::cumulativeDistributiveInverseForProbability(double * probability) { } double p = 0.0; int k = 0; - while (p < *probability && k < k_maxNumberOfOperations) { + double delta = 0.0; + do { + delta = std::fabs(*probability-p); p += evaluateAtDiscreteAbscissa(k++); - } + } while (std::fabs(*probability-p) <= delta && k < k_maxNumberOfOperations); + p -= evaluateAtDiscreteAbscissa(--k); if (k == k_maxNumberOfOperations) { *probability = 1.0; return INFINITY; @@ -104,9 +107,11 @@ double Law::rightIntegralInverseForProbability(double * probability) { } double p = 0.0; int k = 0; - while (p < 1.0 - *probability && k < k_maxNumberOfOperations) { + double delta = 0.0; + do { + delta = std::fabs(1.0-*probability-p); p += evaluateAtDiscreteAbscissa(k++); - } + } while (std::fabs(1.0-*probability-p) <= delta && k < k_maxNumberOfOperations); if (k == k_maxNumberOfOperations) { *probability = 1.0; return INFINITY;