mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[poincare] Unit: improve BuildTimeSplit to avoid displaing null sub unit
in the final addition and to keep the fractional part of the seconds
This commit is contained in:
@@ -435,8 +435,8 @@ bool Unit::IsISTime(Expression & e) {
|
||||
|
||||
Expression Unit::BuildTimeSplit(double seconds) {
|
||||
assert(!std::isnan(seconds));
|
||||
if (std::isinf(seconds)) {
|
||||
return Multiplication::Builder(Infinity::Builder(seconds < 0.0), Unit::Second());
|
||||
if (std::isinf(seconds) || std::fabs(seconds) < Expression::Epsilon<double>()) {
|
||||
return Multiplication::Builder(Number::FloatNumber(seconds), Unit::Second());
|
||||
}
|
||||
double remain = seconds;
|
||||
constexpr static int numberOfTimeUnits = 6;
|
||||
@@ -446,10 +446,16 @@ Expression Unit::BuildTimeSplit(double seconds) {
|
||||
double valuesPerUnit[numberOfTimeUnits];
|
||||
Addition a = Addition::Builder();
|
||||
for (size_t i = 0; i < numberOfTimeUnits; i++) {
|
||||
valuesPerUnit[i] = std::floor(remain/timeFactors[i]);
|
||||
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]);
|
||||
}
|
||||
remain -= valuesPerUnit[i]*timeFactors[i];
|
||||
Multiplication m = Multiplication::Builder(Float<double>::Builder(valuesPerUnit[i]), units[i]);
|
||||
a.addChildAtIndexInPlace(m, a.numberOfChildren(), a.numberOfChildren());
|
||||
if (std::fabs(valuesPerUnit[i]) > Expression::Epsilon<double>()) {
|
||||
Multiplication m = Multiplication::Builder(Float<double>::Builder(valuesPerUnit[i]), units[i]);
|
||||
a.addChildAtIndexInPlace(m, a.numberOfChildren(), a.numberOfChildren());
|
||||
}
|
||||
if (std::fabs(remain) < Expression::Epsilon<double>()) {
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user