From 3f48f49fbec23ab229e894e80d88a515d7b4c76f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 17 Nov 2017 16:47:57 +0100 Subject: [PATCH] [poincare] Fix infinite loop in power Change-Id: I9b1ce1500303cbe880a75ac87c09a36721426332 --- poincare/src/power.cpp | 6 ++++-- poincare/test/simplify_easy.cpp | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index 0c8b06f14..28421dc0c 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -270,9 +270,11 @@ Expression * Power::shallowReduce(Context& context, AngleUnit angleUnit) { if (operand(1)->type() == Type::Rational && static_cast(editableOperand(1))->denominator().isOne()) { return simplifyPowerMultiplication(m, editableOperand(1), context, angleUnit); } - // (a*b*...)^r -> |a|^r*(sign(a)*b*)^r if a rational + // (a*b*...)^r -> |a|^r*(sign(a)*b*...)^r if a rational for (int i = 0; i < m->numberOfOperands(); i++) { - if (m->operand(i)->sign() == Sign::Positive || m->operand(i)->type() == Type::Rational) { + // a is signed and a != -1 + if (m->operand(i)->sign() != Sign::Unknown && (m->operand(i)->type() != Type::Rational || !static_cast(m->operand(i))->isMinusOne())) { + //if (m->operand(i)->sign() == Sign::Positive || m->operand(i)->type() == Type::Rational) { Expression * r = editableOperand(1); Expression * rCopy = r->clone(); Expression * factor = m->editableOperand(i); diff --git a/poincare/test/simplify_easy.cpp b/poincare/test/simplify_easy.cpp index 76dcbc515..e8b9f03a4 100644 --- a/poincare/test/simplify_easy.cpp +++ b/poincare/test/simplify_easy.cpp @@ -478,6 +478,7 @@ QUIZ_CASE(poincare_simplify_easy) { assert_parsed_expression_simplify_to("10^log(P)", "P"); assert_parsed_expression_simplify_to("log(1/R(2))", "-log(2)/2"); assert_parsed_expression_simplify_to("log(-I)", "log(-I)"); + assert_parsed_expression_simplify_to("R(-I)", "R(-I)"); /* This does not work but should not as it is above k_primorial32 = 1*3*5*7*11*... (product of first 32 primes. */ //assert_parsed_expression_simplify_to("1881676377434183981909562699940347954480361860897069^(1/3)", "123456789123456789");