Handle possible overflow in TrustRegionStepEvaluator.

Thanks to Volker Grabe for reporting the problem and suggesting
a fix.

Change-Id: I8072ffb275907baac62ee2ad84a02f17eb447c63
diff --git a/internal/ceres/trust_region_step_evaluator.cc b/internal/ceres/trust_region_step_evaluator.cc
index c9167e6..33b0c41 100644
--- a/internal/ceres/trust_region_step_evaluator.cc
+++ b/internal/ceres/trust_region_step_evaluator.cc
@@ -29,6 +29,7 @@
 // Author: sameeragarwal@google.com (Sameer Agarwal)
 
 #include <algorithm>
+#include <limits>
 #include "ceres/trust_region_step_evaluator.h"
 #include "glog/logging.h"
 
@@ -51,6 +52,15 @@
 double TrustRegionStepEvaluator::StepQuality(
     const double cost,
     const double model_cost_change) const {
+  // If the function evaluation for this step was a failure, in which
+  // case the TrustRegionMinimizer would have set the cost to
+  // std::numeric_limits<double>::max(). In this case, the division by
+  // model_cost_change can result in an overflow. To prevent that from
+  // happening, we will deal with this case explicitly.
+  if (cost >= std::numeric_limits<double>::max()) {
+    return std::numeric_limits<double>::lowest();
+  }
+
   const double relative_decrease = (current_cost_ - cost) / model_cost_change;
   const double historical_relative_decrease =
       (reference_cost_ - cost) /