[apps] Calculation: exact and approximate output can be equal even if

the exact output is not a rational: 1/2+i = 0.5+i
This commit is contained in:
Émilie Feral
2018-01-30 10:21:17 +01:00
committed by EmilieNumworks
parent 26af09843e
commit f2db9f2065
3 changed files with 9 additions and 8 deletions

View File

@@ -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<double>::convertFloatToText(static_cast<Complex<double> *>(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;

View File

@@ -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

View File

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