From b712338a187cf1bbe12169f4840c48c779c8e163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 3 Sep 2019 10:04:19 +0200 Subject: [PATCH] [apps/proba] Fix dome distribution behaviours for x = infinity --- apps/probability/distribution/student_distribution.cpp | 3 +++ poincare/src/normal_distribution.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/probability/distribution/student_distribution.cpp b/apps/probability/distribution/student_distribution.cpp index 39c510552..dd22a46ad 100644 --- a/apps/probability/distribution/student_distribution.cpp +++ b/apps/probability/distribution/student_distribution.cpp @@ -30,6 +30,9 @@ double StudentDistribution::cumulativeDistributiveFunctionAtAbscissa(double x) c if (x == 0.0) { return 0.5; } + if (std::isinf(x)) { + return 1.0; + } /* TODO There are some computation errors, where the probability falsly jumps to 1. * k = 0.001 and P(x < 42000000) (for 41000000 it is around 0.5) * k = 0.01 and P(x < 8400000) (for 41000000 it is around 0.6) */ diff --git a/poincare/src/normal_distribution.cpp b/poincare/src/normal_distribution.cpp index aac8daaf8..7319341a4 100644 --- a/poincare/src/normal_distribution.cpp +++ b/poincare/src/normal_distribution.cpp @@ -83,18 +83,18 @@ bool NormalDistribution::ExpressionParametersAreOK(bool * result, const Expressi template T NormalDistribution::StandardNormalCumulativeDistributiveFunctionAtAbscissa(T abscissa) { - if (std::isnan(abscissa) || std::isinf(abscissa)) { + if (std::isnan(abscissa)) { return NAN; } + if (std::isinf(abscissa) || abscissa > k_boundStandardNormalDistribution) { + return (T)1.0; + } if (abscissa == (T)0.0) { return (T)0.5; } if (abscissa < (T)0.0) { return ((T)1.0) - StandardNormalCumulativeDistributiveFunctionAtAbscissa(-abscissa); } - if (abscissa > k_boundStandardNormalDistribution) { - return (T)1.0; - } return ((T)0.5) + ((T)0.5) * std::erf(abscissa/std::sqrt(((T)2.0))); }