From 35ebf781dfc4a1f9e8da71755d22d67dfdf64a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 13 Oct 2017 15:47:24 +0200 Subject: [PATCH] [poincare] Fix bug in Cosine::immediateSimplify Change-Id: Ib3fe9c99de1d8e83c7bebd7a28d546b275c0ceba --- poincare/src/cosine.cpp | 22 ++++++++++++---------- poincare/test/simplify_easy.cpp | 4 ++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/poincare/src/cosine.cpp b/poincare/src/cosine.cpp index 5d8bcfdfa..8eacccca6 100644 --- a/poincare/src/cosine.cpp +++ b/poincare/src/cosine.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include extern "C" { #include @@ -22,11 +23,9 @@ Expression * Cosine::clone() const { } Expression * Cosine::immediateSimplify() { - if (operand(0)->type() == Type::Rational && static_cast(operand(0))->isZero()) { - return replaceWith(new Rational(Integer(1)), true); - } - if (operand(0)->type() == Type::Symbol && static_cast(operand(0))->name() == Ion::Charset::SmallPi) { - return replaceWith(new Rational(Integer(0)), true); + Expression * lookup = Trigonometry::table(operand(0), Trigonometry::Function::Cosine, false); + if (lookup != nullptr) { + return replaceWith(lookup, true); } if (operand(0)->sign() < 0) { ((Expression *)operand(0))->turnIntoPositive(); @@ -40,14 +39,17 @@ Expression * Cosine::immediateSimplify() { Rational * newR = new Rational(div.remainder, r->denominator()); const_cast(operand(0))->replaceOperand(r, newR, true); const_cast(operand(0))->immediateSimplify(); - return immediateSimplify(); // recursive + if (Integer::Division(div.quotient, Integer(2)).remainder.isOne()) { + Expression * simplifiedCosine = immediateSimplify(); // recursive + const Expression * multOperands[2] = {new Rational(Integer(-1)), simplifiedCosine->clone()}; + Multiplication * m = new Multiplication(multOperands, 2, false); + return simplifiedCosine->replaceWith(m, true)->immediateSimplify(); + } else { + return immediateSimplify(); // recursive + } } assert(r->sign() > 0); assert(r->numerator().isLowerThan(r->denominator())); - Expression * lookup = Trigonometry::table(operand(0), Trigonometry::Function::Cosine, false); - if (lookup != nullptr) { - return replaceWith(lookup, true); - } } return this; } diff --git a/poincare/test/simplify_easy.cpp b/poincare/test/simplify_easy.cpp index adb969c82..6a7aaca35 100644 --- a/poincare/test/simplify_easy.cpp +++ b/poincare/test/simplify_easy.cpp @@ -144,11 +144,11 @@ QUIZ_CASE(poincare_simplify_easy) { assert_parsed_expression_simplify_to("(1+R(2))/5", "(1+R(2))/5"); // TODO: put 5 on denominator? assert_parsed_expression_simplify_to("(2+R(6))^2", "(2+R(6))^2"); // Check for parenthesis assert_parsed_expression_simplify_to("cos(0)", "1"); - assert_parsed_expression_simplify_to("cos(P)", "0"); + assert_parsed_expression_simplify_to("cos(P)", "-1"); assert_parsed_expression_simplify_to("cos(P*35/29)", "cos(P*6/29)"); assert_parsed_expression_simplify_to("cos(-P*35/29)", "cos(P*6/29)"); assert_parsed_expression_simplify_to("cos(P*340000)", "1"); - assert_parsed_expression_simplify_to("cos(-P*340000)", "1"); + assert_parsed_expression_simplify_to("cos(-P*340001)", "-1"); assert_parsed_expression_simplify_to("cos(P/12)", "(R(6)+R(2))/4"); assert_parsed_expression_simplify_to("cos(-P/12)", "(R(6)+R(2))/4"); assert_parsed_expression_simplify_to("cos(-P*R(2))", "cos(P*R(2))");