diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index f51dd5eae..7aae60e23 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -194,16 +194,7 @@ Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual( if (m_equalSign != EqualSign::Unknown) { return m_equalSign; } - char buffer[k_printedExpressionSize]; - approximateOutput(context)->writeTextInBuffer(buffer, k_printedExpressionSize, Preferences::sharedPreferences()->numberOfSignificantDigits()); - /* Warning: we cannot use directly the m_approximateOutputText but we have to - * re-serialize the approximateOutput because the number of stored - * significative numbers and the number of displayed significative numbers - * are not identical. (For example, 0.000025 might be displayed "0.00003" - * which requires in an approximative equal) */ - Expression * approximateOutput = Expression::ParseAndSimplify(buffer, *context); - m_equalSign = approximateOutput->isIdenticalTo(exactOutput(context)) ? EqualSign::Equal : EqualSign::Approximation; - delete approximateOutput; + m_equalSign = exactOutput(context)->isEqualToItsApproximationLayout(approximateOutput(context), k_printedExpressionSize, Preferences::sharedPreferences()->numberOfSignificantDigits(), *context) ? EqualSign::Equal : EqualSign::Approximation; return m_equalSign; } diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 24e74a8c4..508d6cbb4 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -245,6 +245,7 @@ public: * order on expresssions. */ return SimplificationOrder(this, e, true) == 0; } + bool isEqualToItsApproximationLayout(Expression * approximation, int bufferSize, int numberOfSignificantDigits, Context & context); /* Layout Engine */ ExpressionLayout * createLayout(PrintFloat::Mode floatDisplayMode = PrintFloat::Mode::Default, ComplexFormat complexFormat = ComplexFormat::Default) const; // Returned object must be deleted diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index e761e2532..70200b929 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -325,6 +325,21 @@ int Expression::SimplificationOrder(const Expression * e1, const Expression * e2 } } +bool Expression::isEqualToItsApproximationLayout(Expression * approximation, int bufferSize, int numberOfSignificantDigits, Context & context) { + char buffer[bufferSize]; + approximation->writeTextInBuffer(buffer, bufferSize, numberOfSignificantDigits); + /* Warning: we cannot use directly the the approximate expression but we have + * to re-serialize it because the number of stored significative + * numbers and the number of displayed significative numbers might not be + * identical. (For example, 0.000025 might be displayed "0.00003" and stored + * as Decimal(0.000025) and isEqualToItsApproximationLayout should return + * false) */ + Expression * approximateOutput = Expression::ParseAndSimplify(buffer, context); + bool equal = isIdenticalTo(approximateOutput); + delete approximateOutput; + return equal; +} + /* Layout */ ExpressionLayout * Expression::createLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const {