mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-27 17:50:04 +01:00
[poincare] Fix bug in Cosine::immediateSimplify
Change-Id: Ib3fe9c99de1d8e83c7bebd7a28d546b275c0ceba
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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))");
|
||||
|
||||
Reference in New Issue
Block a user