From d9af0300d4bd7d636d179552c040a403e9cdbdde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 2 Oct 2019 17:58:30 +0200 Subject: [PATCH] [poincare] Decimal: change order definition on Decimal expression Now, Decimal node "1.000E3" is not equal to Decimal node "1E3" node anymore. This prevents from using double comparison (which is sometimes wrong due to double precision) to implement decimal comparison. --- poincare/include/poincare/decimal.h | 3 +++ poincare/src/decimal.cpp | 4 +--- poincare/test/expression.cpp | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/poincare/include/poincare/decimal.h b/poincare/include/poincare/decimal.h index 90e58005b..60b7e69ba 100644 --- a/poincare/include/poincare/decimal.h +++ b/poincare/include/poincare/decimal.h @@ -53,6 +53,9 @@ public: } // Comparison + /* Warning: Decimal(mantissa: 1000, exponent: 3) and Decimal(mantissa: 1, exponent: 3) + * are strictly ordered with the SimplificationOrder although they are equal + * with the usual math order (1.000E3 == 1E3). */ int simplificationOrderSameType(const ExpressionNode * e, bool ascending, bool canBeInterrupted) const override; // Simplification diff --git a/poincare/src/decimal.cpp b/poincare/src/decimal.cpp index 5fb7ef0e2..62c72ecb9 100644 --- a/poincare/src/decimal.cpp +++ b/poincare/src/decimal.cpp @@ -81,9 +81,7 @@ int DecimalNode::simplificationOrderSameType(const ExpressionNode * e, bool asce } else { assert(m_exponent == other->m_exponent); assert(exponent() == other->exponent()); - double approx0 = templatedApproximate(); - double approx1 = other->templatedApproximate(); - return (approx0 == approx1 ? 0 : (approx0 < approx1 ? -1 : 1)); + unsignedComparison = Integer::NaturalOrder(unsignedMantissa(), other->unsignedMantissa()); } return ((int)Number(this).sign())*unsignedComparison; } diff --git a/poincare/test/expression.cpp b/poincare/test/expression.cpp index a7c69f080..a18c0bf5a 100644 --- a/poincare/test/expression.cpp +++ b/poincare/test/expression.cpp @@ -48,8 +48,9 @@ QUIZ_CASE(poincare_expression_decimal_constructor) { assert_pool_size(initialPoolSize+4); assert_equal(Decimal::Builder("25", 3), Decimal::Builder("25", 3)); - assert_equal(Decimal::Builder("1000", -3), Decimal::Builder("1", -3)); - assert_equal(Decimal::Builder("1000", 3), Decimal::Builder("1", 3)); + assert_equal(Decimal::Builder("25", 3), Decimal::Builder(25, 3)); + assert_not_equal(Decimal::Builder("1000", -3), Decimal::Builder("1", -3)); + assert_not_equal(Decimal::Builder("1000", 3), Decimal::Builder("1", 3)); assert_not_equal(Decimal::Builder(123,234), Decimal::Builder(42, 108)); assert_not_equal(Decimal::Builder(12,2), Decimal::Builder(123, 2)); assert_not_equal(Decimal::Builder(1234,2), Decimal::Builder(1234,3));