From 6072ffd84836215c409f59d51bb3e04a94dff008 Mon Sep 17 00:00:00 2001 From: Arthur Camouseigt Date: Wed, 1 Jul 2020 16:18:50 +0200 Subject: [PATCH] [poincare/normal_distribution.cpp] Fixed approximation error Removed limitation in calculation of normal_distribution. It was used to speed-up computation but yielded 0 for small values. Previously P(X<5) with X->N(7,0.3162) gave 0 as a result now it gives 1.26e-10 Change-Id: I3f1c997dfe2ba6424b372a0a82af6d9871443657 --- poincare/include/poincare/normal_distribution.h | 5 ----- poincare/src/normal_distribution.cpp | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/poincare/include/poincare/normal_distribution.h b/poincare/include/poincare/normal_distribution.h index fe30513f8..e9a54a273 100644 --- a/poincare/include/poincare/normal_distribution.h +++ b/poincare/include/poincare/normal_distribution.h @@ -16,11 +16,6 @@ public: * The result of the verification is *result. */ static bool ExpressionMuAndVarAreOK(bool * result, const Expression & mu, const Expression & sigma, Context * context); private: - /* For the standard normal distribution, P(X < y) > 0.99999995 for y >= 5.33 so the - * value displayed is 1. But this is dependent on the fact that we display - * only 7 decimal values! */ - static_assert(Preferences::LargeNumberOfSignificantDigits == 7, "k_boundStandardNormalDistribution is ill-defined compared to LargeNumberOfSignificantDigits"); - constexpr static double k_boundStandardNormalDistribution = 5.33; template static T StandardNormalCumulativeDistributiveFunctionAtAbscissa(T abscissa); template static T StandardNormalCumulativeDistributiveInverseForProbability(T probability); }; diff --git a/poincare/src/normal_distribution.cpp b/poincare/src/normal_distribution.cpp index 710dfacb8..425f90f0f 100644 --- a/poincare/src/normal_distribution.cpp +++ b/poincare/src/normal_distribution.cpp @@ -88,7 +88,7 @@ T NormalDistribution::StandardNormalCumulativeDistributiveFunctionAtAbscissa(T a if (std::isnan(abscissa)) { return NAN; } - if (std::isinf(abscissa) || std::fabs(abscissa) > k_boundStandardNormalDistribution) { + if (std::isinf(abscissa)) { return abscissa > (T)0.0 ? (T)1.0 : (T)0.0; } if (abscissa == (T)0.0) {