diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index 98469c185..2c8827cf9 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -192,13 +192,14 @@ bool Calculation::shouldDisplayApproximateOutput(Context * context) { return input()->isApproximate(*context); } -bool Calculation::exactAndApproximateOutputsAreEqual(Poincare::Context * context) { - if (exactOutput(context)->type() != Expression::Type::Rational) { - return false; - } - assert(approximateOutput(context)->type() == Type::Complex); +bool Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context) { char buffer[k_printedExpressionSize]; - Complex::convertFloatToText(static_cast *>(approximateOutput(context))->a(), buffer, k_printedExpressionSize, Preferences::sharedPreferences()->numberOfSignificantDigits(), Preferences::sharedPreferences()->displayMode()); + 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); bool isEqual = approximateOutput->isIdenticalTo(exactOutput(context)); delete approximateOutput; diff --git a/apps/calculation/calculation.h b/apps/calculation/calculation.h index ce28f55d3..eaf4c6234 100644 --- a/apps/calculation/calculation.h +++ b/apps/calculation/calculation.h @@ -31,7 +31,7 @@ public: bool isEmpty(); void tidy(); bool shouldDisplayApproximateOutput(Poincare::Context * context); - bool exactAndApproximateOutputsAreEqual(Poincare::Context * context); + bool exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context); constexpr static int k_printedExpressionSize = 2*::TextField::maxBufferSize(); private: /* Buffers holding text expressions have to be longer than the text written diff --git a/apps/calculation/history_view_cell.cpp b/apps/calculation/history_view_cell.cpp index 2193d6f20..a1f6881ee 100644 --- a/apps/calculation/history_view_cell.cpp +++ b/apps/calculation/history_view_cell.cpp @@ -90,7 +90,7 @@ void HistoryViewCell::setCalculation(Calculation * calculation) { * outputView()->layoutSubviews() is going to fail. */ Poincare::ExpressionLayout * outputExpressions[2] = {calculation->approximateOutputLayout(calculationApp->localContext()), calculation->shouldDisplayApproximateOutput(calculationApp->localContext()) ? nullptr : calculation->exactOutputLayout(calculationApp->localContext())}; m_scrollableOutputView.outputView()->setExpressions(outputExpressions); - I18n::Message equalMessage = calculation->exactAndApproximateOutputsAreEqual(calculationApp->localContext()) ? I18n::Message::Equal : I18n::Message::AlmostEqual; + I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(calculationApp->localContext()) ? I18n::Message::Equal : I18n::Message::AlmostEqual; m_scrollableOutputView.outputView()->setEqualMessage(equalMessage); }