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