diff --git a/apps/probability/distribution/geometric_distribution.cpp b/apps/probability/distribution/geometric_distribution.cpp index 6c76fd365..ed64b23ab 100644 --- a/apps/probability/distribution/geometric_distribution.cpp +++ b/apps/probability/distribution/geometric_distribution.cpp @@ -15,8 +15,7 @@ float GeometricDistribution::xMax() const { } float GeometricDistribution::yMax() const { - int maxAbscissa = 0; - float result = evaluateAtAbscissa(maxAbscissa); + float result = evaluateAtAbscissa(1.0); // Tha probability is max for x == 1 return result * (1.0f + k_displayTopMarginRatio); } @@ -29,16 +28,18 @@ bool GeometricDistribution::authorizedValueAtIndex(float x, int index) const { } template -T GeometricDistribution::templatedApproximateAtAbscissa(T x) const { - if (x < 0) { +T GeometricDistribution::templatedApproximateAtAbscissa(T k) const { + constexpr T castedOne = static_cast(1.0); + if (k < castedOne) { return static_cast(0.0); } T p = static_cast(m_parameter1); - if (p == static_cast(1.0)) { - return static_cast(x == 0 ? 1.0 : 0.0); + if (p == castedOne) { + return k == castedOne ? castedOne : static_cast(0.0); } - T lResult = x * std::log(static_cast(1.0) - p); - return p*std::exp(lResult); + // The result is p * (1-p)^{k-1} + T lResult = (k - castedOne) * std::log(castedOne - p); + return p * std::exp(lResult); } } diff --git a/apps/probability/distribution/geometric_distribution.h b/apps/probability/distribution/geometric_distribution.h index 035d2945e..e6903555a 100644 --- a/apps/probability/distribution/geometric_distribution.h +++ b/apps/probability/distribution/geometric_distribution.h @@ -7,9 +7,7 @@ namespace Probability { /* We chose the definition: * 0 < p <= 1 for success probability - * k failures where k ∈ {0, 1, 2, ... } - * The distribution follows the probability distribution of the number of failures before - * the first success. */ + * k number of trials needed to get one success, where k ∈ {1, 2, 3, ...}. */ class GeometricDistribution final : public OneParameterDistribution { public: