From dfcb502ef46df5f18aa64c7e3ca6a06fb0ca1e05 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 8 Jan 2018 12:17:39 +0100 Subject: GCodeTimeEstimator - Fixed square roots of negative numbers --- xs/src/libslic3r/GCodeTimeEstimator.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'xs/src/libslic3r') diff --git a/xs/src/libslic3r/GCodeTimeEstimator.cpp b/xs/src/libslic3r/GCodeTimeEstimator.cpp index 2edbfeac5..b65ff555b 100644 --- a/xs/src/libslic3r/GCodeTimeEstimator.cpp +++ b/xs/src/libslic3r/GCodeTimeEstimator.cpp @@ -56,7 +56,9 @@ namespace Slic3r { float GCodeTimeEstimator::Block::Trapezoid::speed_from_distance(float initial_feedrate, float distance, float acceleration) { - return ::sqrt(sqr(initial_feedrate) + 2.0f * acceleration * distance); + // to avoid invalid negative numbers due to numerical imprecision + float value = std::max(0.0f, sqr(initial_feedrate) + 2.0f * acceleration * distance); + return ::sqrt(value); } float GCodeTimeEstimator::Block::move_length() const @@ -122,7 +124,9 @@ namespace Slic3r { float GCodeTimeEstimator::Block::max_allowable_speed(float acceleration, float target_velocity, float distance) { - return ::sqrt(sqr(target_velocity) - 2.0f * acceleration * distance); + // to avoid invalid negative numbers due to numerical imprecision + float value = std::max(0.0f, sqr(target_velocity) - 2.0f * acceleration * distance); + return ::sqrt(value); } float GCodeTimeEstimator::Block::estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) -- cgit v1.2.3