[poincare] Fix bug in Cosine::immediateSimplify

Change-Id: Ib3fe9c99de1d8e83c7bebd7a28d546b275c0ceba
This commit is contained in:
Émilie Feral
2017-10-13 15:47:24 +02:00
parent 014dae3a56
commit 35ebf781df
2 changed files with 14 additions and 12 deletions

View File

@@ -4,6 +4,7 @@
#include <poincare/symbol.h>
#include <poincare/rational.h>
#include <poincare/trigonometry.h>
#include <poincare/multiplication.h>
#include <ion.h>
extern "C" {
#include <assert.h>
@@ -22,11 +23,9 @@ Expression * Cosine::clone() const {
}
Expression * Cosine::immediateSimplify() {
if (operand(0)->type() == Type::Rational && static_cast<const Rational *>(operand(0))->isZero()) {
return replaceWith(new Rational(Integer(1)), true);
}
if (operand(0)->type() == Type::Symbol && static_cast<const Symbol *>(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<Expression *>(operand(0))->replaceOperand(r, newR, true);
const_cast<Expression *>(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;
}

View File

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