Accumulate the total estimated print in doubles instead of floats.

Because total print time is typically a big floating point number and the time of trapezoid is typically a small number, summing those numbers leads to a loss in precision. Switching to doubles reduces the loss of precision.
This commit is contained in:
Lukáš Hejl 2024-08-16 14:35:49 +02:00 committed by Lukas Matena
parent 90073dce70
commit c5982f4019
2 changed files with 8 additions and 6 deletions

View File

@ -311,7 +311,7 @@ void GCodeProcessor::TimeMachine::calculate_time(GCodeProcessorResult& result, P
if (i == 0)
block_time += additional_time;
time += block_time;
time += double(block_time);
result.moves[block.move_id].time[static_cast<size_t>(mode)] = block_time;
gcode_time.cache += block_time;
if (block.layer_id == 1)
@ -404,12 +404,12 @@ void GCodeProcessor::TimeMachine::calculate_time(GCodeProcessorResult& result, P
std::nullopt
});
}
g1_times_cache.push_back({ block.g1_line_id, block.remaining_internal_g1_lines, time });
g1_times_cache.push_back({ block.g1_line_id, block.remaining_internal_g1_lines, float(time) });
// update times for remaining time to printer stop placeholders
auto it_stop_time = std::lower_bound(stop_times.begin(), stop_times.end(), block.g1_line_id,
[](const StopTime& t, unsigned int value) { return t.g1_line_id < value; });
if (it_stop_time != stop_times.end() && it_stop_time->g1_line_id == block.g1_line_id)
it_stop_time->elapsed_time = time;
it_stop_time->elapsed_time = float(time);
}
if (keep_last_n_blocks) {
@ -1397,12 +1397,12 @@ void GCodeProcessor::finalize(bool perform_post_process)
float GCodeProcessor::get_time(PrintEstimatedStatistics::ETimeMode mode) const
{
return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? m_time_processor.machines[static_cast<size_t>(mode)].time : 0.0f;
return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? float(m_time_processor.machines[static_cast<size_t>(mode)].time) : 0.0f;
}
std::string GCodeProcessor::get_time_dhm(PrintEstimatedStatistics::ETimeMode mode) const
{
return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? short_time(get_time_dhms(m_time_processor.machines[static_cast<size_t>(mode)].time)) : std::string("N/A");
return (mode < PrintEstimatedStatistics::ETimeMode::Count) ? short_time(get_time_dhms(float(m_time_processor.machines[static_cast<size_t>(mode)].time))) : std::string("N/A");
}
std::vector<std::pair<CustomGCode::Type, std::pair<float, float>>> GCodeProcessor::get_custom_gcode_times(PrintEstimatedStatistics::ETimeMode mode, bool include_remaining) const

View File

@ -340,7 +340,9 @@ namespace Slic3r {
// hard limit for the travel acceleration, to which the firmware will clamp.
float max_travel_acceleration; // mm/s^2
float extrude_factor_override_percentage;
float time; // s
// We accumulate total print time in doubles to reduce the loss of precision
// while adding big floating numbers with small float numbers.
double time; // s
struct StopTime
{
unsigned int g1_line_id;