diff --git a/poincare/src/round.cpp b/poincare/src/round.cpp index ac379508d..60cc6bedc 100644 --- a/poincare/src/round.cpp +++ b/poincare/src/round.cpp @@ -1,5 +1,6 @@ #include #include +#include extern "C" { #include @@ -27,6 +28,22 @@ Expression * Round::shallowReduce(Context& context, AngleUnit angleUnit) { return replaceWith(new Undefined(), true); } #endif + if (operand(0)->type() == Type::Rational && operand(1)->type() == Type::Rational) { + Rational * r1 = static_cast(editableOperand(0)); + Rational * r2 = static_cast(editableOperand(1)); + if (!r2->denominator().isOne()) { + return replaceWith(new Undefined(), true); + } + Rational err = Rational::Power(Rational(10), r2->numerator()); + Rational mult = Rational::Multiplication(*r1, Rational(err)); + IntegerDivision d = Integer::Division(mult.numerator(), mult.denominator()); + Integer rounding = d.quotient; + if (Rational::NaturalOrder(Rational(d.remainder, mult.denominator()), Rational(1,2)) >= 0) { + rounding = Integer::Addition(rounding, Integer(1)); + } + Rational result = Rational::Multiplication(rounding, Rational::Power(Rational(1,10), r2->numerator())); + return replaceWith(new Rational(result), true); + } return this; // TODO: implement for rationals! } diff --git a/poincare/test/simplify_easy.cpp b/poincare/test/simplify_easy.cpp index 274173870..276a8647a 100644 --- a/poincare/test/simplify_easy.cpp +++ b/poincare/test/simplify_easy.cpp @@ -149,6 +149,11 @@ QUIZ_CASE(poincare_simplify_easy) { assert_parsed_expression_simplify_to("lcm(123,278)", "34194"); assert_parsed_expression_simplify_to("lcm(11,121)", "121"); assert_parsed_expression_simplify_to("root(4,3)", "4^(1/3)"); + assert_parsed_expression_simplify_to("round(4.235,2)", "4.24"); + assert_parsed_expression_simplify_to("round(4.23,0)", "4"); + assert_parsed_expression_simplify_to("round(4.9,0)", "5"); + assert_parsed_expression_simplify_to("round(12.9,-1)", "10"); + assert_parsed_expression_simplify_to("round(12.9,-2)", "0"); assert_parsed_expression_simplify_to("permute(99,4)", "90345024"); assert_parsed_expression_simplify_to("permute(20,-10)", "undef"); assert_parsed_expression_simplify_to("re(1/2)", "1/2");