From 761be1c8c79b0502c68e110bc3f9de5f50c8aedd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 13 Feb 2017 14:11:06 +0100 Subject: [PATCH] [apps/probability] Comments to explain the 0.001 precision is proba Change-Id: Id5618802f9a08967b2fa0d68b35ff2a4f0b5a116 --- apps/probability/calculation/calculation.h | 3 +++ apps/probability/calculation/finite_integral_calculation.cpp | 1 - apps/probability/calculation/left_integral_calculation.cpp | 1 - apps/probability/calculation/right_integral_calculation.cpp | 1 - apps/probability/law/normal_law.cpp | 2 ++ 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/probability/calculation/calculation.h b/apps/probability/calculation/calculation.h index eeb11df5a..0ee4e2d54 100644 --- a/apps/probability/calculation/calculation.h +++ b/apps/probability/calculation/calculation.h @@ -17,6 +17,9 @@ public: virtual float lowerBound(); virtual float upperBound(); protected: + /* Parameters in probability application are rounded to 3 decimals. This is + * due to the limited precision of some calculation (e. g. standard normal + * cumulative distributive function or inverse). */ constexpr static float k_precision = 0.001f; virtual void compute(int indexKnownElement) = 0; Law * m_law; diff --git a/apps/probability/calculation/finite_integral_calculation.cpp b/apps/probability/calculation/finite_integral_calculation.cpp index 1e4b69774..08b940641 100644 --- a/apps/probability/calculation/finite_integral_calculation.cpp +++ b/apps/probability/calculation/finite_integral_calculation.cpp @@ -32,7 +32,6 @@ const char * FiniteIntegralCalculation::legendForParameterAtIndex(int index) { void FiniteIntegralCalculation::setParameterAtIndex(float f, int index) { assert(index >= 0 && index < 3); -/* Parameters in probability application are rounder to 3 decimals */ float rf = roundf(f/k_precision)*k_precision; if (index == 0) { m_lowerBound = rf; diff --git a/apps/probability/calculation/left_integral_calculation.cpp b/apps/probability/calculation/left_integral_calculation.cpp index 3e4cd904d..fb3d5a53f 100644 --- a/apps/probability/calculation/left_integral_calculation.cpp +++ b/apps/probability/calculation/left_integral_calculation.cpp @@ -28,7 +28,6 @@ const char * LeftIntegralCalculation::legendForParameterAtIndex(int index) { void LeftIntegralCalculation::setParameterAtIndex(float f, int index) { assert(index >= 0 && index < 2); - /* Parameters in probability application are rounder to 3 decimals */ float rf = roundf(f/k_precision)*k_precision; if (index == 0) { m_upperBound = rf; diff --git a/apps/probability/calculation/right_integral_calculation.cpp b/apps/probability/calculation/right_integral_calculation.cpp index 66ac35c58..2defaf1cf 100644 --- a/apps/probability/calculation/right_integral_calculation.cpp +++ b/apps/probability/calculation/right_integral_calculation.cpp @@ -28,7 +28,6 @@ const char * RightIntegralCalculation::legendForParameterAtIndex(int index) { void RightIntegralCalculation::setParameterAtIndex(float f, int index) { assert(index >= 0 && index < 2); -/* Parameters in probability application are rounder to 3 decimals */ float rf = roundf(f/k_precision)*k_precision; if (index == 0) { m_lowerBound = rf; diff --git a/apps/probability/law/normal_law.cpp b/apps/probability/law/normal_law.cpp index 0e6400751..8b079c629 100644 --- a/apps/probability/law/normal_law.cpp +++ b/apps/probability/law/normal_law.cpp @@ -107,6 +107,7 @@ float NormalLaw::standardNormalCumulativeDistributiveFunctionAtAbscissa(float ab if (abscissa > k_boundStandardNormalDistribution) { return 1.0f; } + /* Waissi & Rossin's formula (error less than 0.0001) */ return 1.0f/(1.0f+expf(-sqrtf(M_PI)*(k_beta1*powf(abscissa,5)+k_beta2*powf(abscissa,3)+k_beta3*abscissa))); } @@ -120,6 +121,7 @@ float NormalLaw::standardNormalCumulativeDistributiveInverseForProbability(float if (probability < 0.5f) { return -standardNormalCumulativeDistributiveInverseForProbability(1-probability); } + /* Soranzo & Epure (error less than 0.001) */ return (k_alpha3/logf(k_alpha2))*logf(1.0f - logf(-logf(probability)/logf(2.0f))/logf(k_alpha1)); }