diff --git a/poincare/include/poincare/factor.h b/poincare/include/poincare/factor.h index 922d6e0b7..7f8dc7668 100644 --- a/poincare/include/poincare/factor.h +++ b/poincare/include/poincare/factor.h @@ -33,9 +33,7 @@ private: /* Evaluation */ Evaluation approximate(SinglePrecision p, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const override { return templatedApproximate(context, complexFormat, angleUnit); } Evaluation approximate(DoublePrecision p, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const override { return templatedApproximate(context, complexFormat, angleUnit); } - template Evaluation templatedApproximate(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const { - return childAtIndex(0)->approximate(T(), context, complexFormat, angleUnit); - } + template Evaluation templatedApproximate(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; }; class Factor final : public Expression { diff --git a/poincare/src/factor.cpp b/poincare/src/factor.cpp index 2d0c5e982..3e0297c12 100644 --- a/poincare/src/factor.cpp +++ b/poincare/src/factor.cpp @@ -35,6 +35,17 @@ Expression FactorNode::shallowBeautify(ReductionContext reductionContext) { return Factor(this).shallowBeautify(reductionContext); } +// Add tests :) +template +Evaluation FactorNode::templatedApproximate(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const { + Evaluation e = childAtIndex(0)->approximate(T(), context, complexFormat, angleUnit); + if (std::isnan(e.toScalar())) { + return Complex::Undefined(); + } + return e; +} + + Multiplication Factor::createMultiplicationOfIntegerPrimeDecomposition(Integer i, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const { assert(!i.isZero()); assert(!i.isNegative()); diff --git a/poincare/test/approximation.cpp b/poincare/test/approximation.cpp index 46629f390..89bc3b8ac 100644 --- a/poincare/test/approximation.cpp +++ b/poincare/test/approximation.cpp @@ -343,6 +343,7 @@ QUIZ_CASE(poincare_approximation_function) { assert_expression_approximates_to("factor(-23/4)", "-5.75"); assert_expression_approximates_to("factor(-123/24)", "-5.125"); + assert_expression_approximates_to("factor(𝐢)", "undef"); assert_expression_approximates_to("inverse([[1,2,3][4,5,-6][7,8,9]])", "[[-1.2917,-0.083333,0.375][1.0833,0.16667,-0.25][0.041667,-0.083333,0.041667]]", Degree, Cartesian, 5); // inverse is not precise enough to display 7 significative digits assert_expression_approximates_to("inverse([[1,2,3][4,5,-6][7,8,9]])", "[[-1.2916666666667,-8.3333333333333ᴇ-2,0.375][1.0833333333333,1.6666666666667ᴇ-1,-0.25][4.1666666666667ᴇ-2,-8.3333333333333ᴇ-2,4.1666666666667ᴇ-2]]"); diff --git a/poincare/test/simplification.cpp b/poincare/test/simplification.cpp index 828f6f204..82aff5136 100644 --- a/poincare/test/simplification.cpp +++ b/poincare/test/simplification.cpp @@ -362,6 +362,7 @@ QUIZ_CASE(poincare_simplification_function) { assert_parsed_expression_simplify_to("factor(1008/6895)", "\u00122^4×3^2\u0013/\u00125×197\u0013"); assert_parsed_expression_simplify_to("factor(10007)", "10007"); assert_parsed_expression_simplify_to("factor(10007^2)", Undefined::Name()); + assert_parsed_expression_simplify_to("factor(𝐢)", Undefined::Name()); assert_parsed_expression_simplify_to("floor(-1.3)", "-2"); assert_parsed_expression_simplify_to("floor(2π)", "6"); assert_parsed_expression_simplify_to("floor(123456789012345678901234567892/3)", "41152263004115226300411522630");