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))); }