[PPL-devel] [GIT] ppl/ppl(floating_point): Fixed two serious bugs in linear_form_upper_bound.

Fabio Bossi bossi at cs.unipr.it
Mon Sep 14 17:52:58 CEST 2009


Module: ppl/ppl
Branch: floating_point
Commit: ecb0e94a30b0fa34808d2273682db0147a3a8344
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=ecb0e94a30b0fa34808d2273682db0147a3a8344

Author: Fabio Bossi <bossi at cs.unipr.it>
Date:   Mon Sep 14 17:56:12 2009 +0200

Fixed two serious bugs in linear_form_upper_bound.

---

 src/Octagonal_Shape.templates.hh |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/Octagonal_Shape.templates.hh b/src/Octagonal_Shape.templates.hh
index 783fcfb..5729793 100644
--- a/src/Octagonal_Shape.templates.hh
+++ b/src/Octagonal_Shape.templates.hh
@@ -4943,6 +4943,7 @@ linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
   PPL_ASSERT(std::numeric_limits<T>::max_exponent);
 
   const dimension_type lf_space_dimension = lf.space_dimension();
+  PPL_ASSERT(lf_space_dimension <= space_dim);
 
   typedef Interval<T, Interval_Info> FP_Interval_Type;
 
@@ -4968,15 +4969,15 @@ linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
     assign_r(curr_ub, curr_coefficient->upper(), ROUND_NOT_NEEDED);
     if (curr_lb != 0 && curr_ub != 0) {
       assign_r(curr_var_ub, matrix[n_var+1][n_var], ROUND_NOT_NEEDED);
-      mul_2exp_assign_r(curr_var_ub, curr_var_ub, -1, ROUND_IGNORE);
+      div_2exp_assign_r(curr_var_ub, curr_var_ub, 1, ROUND_IGNORE);
       neg_assign_r(curr_minus_var_ub, matrix[n_var][n_var+1], ROUND_NOT_NEEDED);
-      mul_2exp_assign_r(curr_minus_var_ub, curr_minus_var_ub, -1, ROUND_IGNORE);
+      div_2exp_assign_r(curr_minus_var_ub, curr_minus_var_ub, 1, ROUND_IGNORE);
       // Optimize the most common case: curr = +/-[1;1]
       if (curr_lb == 1 && curr_ub == 1) {
         add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
                      ROUND_UP);
       }
-      else if (curr_lb == -1 && curr_ub == 1) {
+      else if (curr_lb == -1 && curr_ub == -1) {
         neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
                      ROUND_NOT_NEEDED);
         add_assign_r(result, result, negator, ROUND_UP);




More information about the PPL-devel mailing list