diff --git a/apps/calculation/additional_outputs/unit_list_controller.cpp b/apps/calculation/additional_outputs/unit_list_controller.cpp index 184ab5f06..c8f654e10 100644 --- a/apps/calculation/additional_outputs/unit_list_controller.cpp +++ b/apps/calculation/additional_outputs/unit_list_controller.cpp @@ -75,7 +75,7 @@ void UnitListController::setExpression(Poincare::Expression e) { } else if (Unit::IsISTime(units)) { // Turn time into ? year + ? month + ? day + ? h + ? min + ? s double value = Shared::PoincareHelpers::ApproximateToScalar(copy, App::app()->localContext()); - m_memoizedExpressions[numberOfMemoizedExpressions++] = Unit::BuildTimeSplit(value); + m_memoizedExpressions[numberOfMemoizedExpressions++] = Unit::BuildTimeSplit(value, App::app()->localContext(), Preferences::sharedPreferences()->complexFormat(), Preferences::sharedPreferences()->angleUnit()); } // 1.d. Simplify and tune prefix of all computed expressions size_t currentExpressionIndex = 0; diff --git a/poincare/include/poincare/unit.h b/poincare/include/poincare/unit.h index e9bb2f2f6..be7c14910 100644 --- a/poincare/include/poincare/unit.h +++ b/poincare/include/poincare/unit.h @@ -758,7 +758,7 @@ public: static Unit Liter() { return Builder(VolumeDimension, LiterRepresentative, &EmptyPrefix); } static Unit ElectronVolt() { return Builder(EnergyDimension, ElectronVoltRepresentative, &EmptyPrefix); } static Unit Watt() { return Builder(PowerDimension, WattRepresentative, &EmptyPrefix); } - static Expression BuildTimeSplit(double seconds); + static Expression BuildTimeSplit(double seconds, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit); static bool IsISSpeed(Expression & e); static bool IsISVolume(Expression & e); diff --git a/poincare/src/unit.cpp b/poincare/src/unit.cpp index 32a2da66e..74642d7d4 100644 --- a/poincare/src/unit.cpp +++ b/poincare/src/unit.cpp @@ -433,7 +433,7 @@ bool Unit::IsISTime(Expression & e) { return e.type() == ExpressionNode::Type::Unit && static_cast(e).isSecond(); } -Expression Unit::BuildTimeSplit(double seconds) { +Expression Unit::BuildTimeSplit(double seconds, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) { assert(!std::isnan(seconds)); if (std::isinf(seconds) || std::fabs(seconds) < Expression::Epsilon()) { return Multiplication::Builder(Number::FloatNumber(seconds), Unit::Second()); @@ -458,7 +458,7 @@ Expression Unit::BuildTimeSplit(double seconds) { valuesPerUnit[i] = remain/timeFactors[i]; // Keep only the floor of the values except for the last unit (seconds) if (i < numberOfTimeUnits - 1) { - valuesPerUnit[i] = std::floor(valuesPerUnit[i]); + valuesPerUnit[i] = valuesPerUnit[i] >= 0.0 ? std::floor(valuesPerUnit[i]) : std::ceil(valuesPerUnit[i]); } remain -= valuesPerUnit[i]*timeFactors[i]; if (std::fabs(valuesPerUnit[i]) > Expression::Epsilon()) { @@ -466,7 +466,9 @@ Expression Unit::BuildTimeSplit(double seconds) { a.addChildAtIndexInPlace(m, a.numberOfChildren(), a.numberOfChildren()); } } - return a.squashUnaryHierarchyInPlace(); + ExpressionNode::ReductionContext reductionContext(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User, ExpressionNode::SymbolicComputation::ReplaceAllDefinedSymbolsWithDefinition, ExpressionNode::UnitConversion::None); + // Beautify the addition into an subtraction if necessary + return a.squashUnaryHierarchyInPlace().shallowBeautify(reductionContext); } template Evaluation UnitNode::templatedApproximate(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const;