From e1fd5ce5fa6ba64fb415dbecb50c32e76b512164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Fri, 23 Aug 2019 11:04:31 +0200 Subject: [PATCH] [poincare/norm_cdf] Evaluation using NormalDistribution --- poincare/src/norm_cdf.cpp | 15 +++++++++++++-- poincare/test/approximation.cpp | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/poincare/src/norm_cdf.cpp b/poincare/src/norm_cdf.cpp index d58c57c84..7e9d02884 100644 --- a/poincare/src/norm_cdf.cpp +++ b/poincare/src/norm_cdf.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -28,8 +29,18 @@ Expression NormCDFNode::shallowReduce(ReductionContext reductionContext) { template Evaluation NormCDFNode::templatedApproximate(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const { - //TODO LEA - return Complex::Builder(0.0); + Evaluation aEvaluation = childAtIndex(0)->approximate(T(), context, complexFormat, angleUnit); + Evaluation muEvaluation = childAtIndex(1)->approximate(T(), context, complexFormat, angleUnit); + Evaluation sigmaEvaluation = childAtIndex(2)->approximate(T(), context, complexFormat, angleUnit); + + T a = aEvaluation.toScalar(); + T mu = muEvaluation.toScalar(); + T sigma = sigmaEvaluation.toScalar(); + + if (std::isnan(a) || std::isnan(mu) || std::isnan(sigma)) { + return Complex::Undefined(); + } + return Complex::Builder(NormalDistribution::CumulativeDistributiveFunctionAtAbscissa(a, mu, sigma)); } Expression NormCDF::shallowReduce(ExpressionNode::ReductionContext reductionContext) { diff --git a/poincare/test/approximation.cpp b/poincare/test/approximation.cpp index 7e1f7f8b0..993b70295 100644 --- a/poincare/test/approximation.cpp +++ b/poincare/test/approximation.cpp @@ -276,6 +276,9 @@ QUIZ_CASE(poincare_approximation_function) { assert_expression_approximates_to("log(2)", "0.30103"); assert_expression_approximates_to("log(2)", "3.0102999566398ᴇ-1"); + assert_expression_approximates_to("normcdf(1.2, 3.4, 5.6)", "0.3472125"); + assert_expression_approximates_to("normcdf(1.2, 3.4, 5.6)", "3.4721249841587ᴇ-1"); + assert_expression_approximates_to("permute(10, 4)", "5040"); assert_expression_approximates_to("permute(10, 4)", "5040");