
Module: ppl/ppl Branch: floating_point Commit: ecb0e94a30b0fa34808d2273682db0147a3a8344 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=ecb0e94a30b0f...
Author: Fabio Bossi bossi@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);