mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[poincare] Unit::BuildTimeSplit can split negative time
This commit is contained in:
@@ -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<double>(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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -433,7 +433,7 @@ bool Unit::IsISTime(Expression & e) {
|
||||
return e.type() == ExpressionNode::Type::Unit && static_cast<Unit &>(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<double>()) {
|
||||
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<double>()) {
|
||||
@@ -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<float> UnitNode::templatedApproximate<float>(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const;
|
||||
|
||||
Reference in New Issue
Block a user