diff --git a/poincare/src/integer.cpp b/poincare/src/integer.cpp index b85150974..fc67dda66 100644 --- a/poincare/src/integer.cpp +++ b/poincare/src/integer.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include extern "C" { @@ -685,9 +687,18 @@ IntegerDivision Integer::udiv(const Integer & numerator, const Integer & denomin } Expression Integer::CreateMixedFraction(const Integer & num, const Integer & denom) { - Expression quo = DivisionQuotient::Reduce(num, denom); - Expression rem = DivisionRemainder::Reduce(num, denom); - return Addition::Builder(quo, Division::Builder(rem, Rational::Builder(denom))); + Integer numPositive(num), denomPositive(denom); + numPositive.setNegative(false); + denomPositive.setNegative(false); + Expression quo = DivisionQuotient::Reduce(numPositive, denomPositive); + Expression rem = DivisionRemainder::Reduce(numPositive, denomPositive); + if (num.isNegative() == denom.isNegative()) { + return Addition::Builder(quo, Division::Builder(rem, Rational::Builder(denomPositive))); + } + return Subtraction::Builder( + /* Do not add a minus sign before a zero. */ + (NaturalOrder(numPositive, denomPositive) < 0) ? quo : Opposite::Builder(quo), + Division::Builder(rem, Rational::Builder(denomPositive))); }