[PPL-devel] [GIT] ppl/ppl(master): Improved implementation of OR_Matrix<T>:: any_row_iterator<U>::operator+=().

Enea Zaffanella zaffanella at cs.unipr.it
Sun Feb 26 11:36:11 CET 2012


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

Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date:   Sun Feb 26 11:29:11 2012 +0100

Improved implementation of OR_Matrix<T>::any_row_iterator<U>::operator+=().
Increased readability:
 - separated explicit type conversions from code performing arithmetic
   operations (on non-mixed typed values);
 - added a few redundant parentheses.
Similar improvement applied to a couple of other functions.
Detected by ECLAIR service utypflag.

---

 src/Linear_Form.templates.hh |    5 +++--
 src/OR_Matrix.inlines.hh     |   18 ++++++++++++------
 src/checked_float.inlines.hh |    7 ++++---
 3 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/src/Linear_Form.templates.hh b/src/Linear_Form.templates.hh
index aa52658..2630f0f 100644
--- a/src/Linear_Form.templates.hh
+++ b/src/Linear_Form.templates.hh
@@ -422,8 +422,9 @@ Linear_Form<C>::relative_error(
 
   C error_propagator;
   // We assume that f_base is a power of 2.
-  int power = static_cast<int>(msb_position(f_base) * f_mantissa_bits);
-  analyzer_format lb = static_cast<analyzer_format>(ldexp(1.0, -power));
+  unsigned int u_power = msb_position(f_base) * f_mantissa_bits;
+  int neg_power = -static_cast<int>(u_power);
+  analyzer_format lb = static_cast<analyzer_format>(ldexp(1.0, neg_power));
 
   error_propagator.build(i_constraint(GREATER_OR_EQUAL, -lb),
                          i_constraint(LESS_OR_EQUAL, lb));
diff --git a/src/OR_Matrix.inlines.hh b/src/OR_Matrix.inlines.hh
index 7a20e71..a138c01 100644
--- a/src/OR_Matrix.inlines.hh
+++ b/src/OR_Matrix.inlines.hh
@@ -243,14 +243,20 @@ template <typename T>
 template <typename U>
 inline typename OR_Matrix<T>::template any_row_iterator<U>&
 OR_Matrix<T>::any_row_iterator<U>::operator+=(const difference_type m) {
-  difference_type increment = m + m * m / 2 + m * static_cast<difference_type>(e);
-  if (e % 2 == 0 && m % 2 != 0)
+  difference_type e_dt = static_cast<difference_type>(e);
+  difference_type i_dt = static_cast<difference_type>(i);
+  difference_type increment = m + (m * m / 2) + (m * e_dt);
+  if (e_dt % 2 == 0 && m % 2 != 0)
     ++increment;
-  e = static_cast<dimension_type>(static_cast<difference_type>(e) + m);
-  i = static_cast<dimension_type>(static_cast<difference_type>(i) + increment);
+  e_dt += m;
+  i_dt += increment;
+  e = static_cast<dimension_type>(e_dt);
+  i = static_cast<dimension_type>(i_dt);
   value.first += increment;
 #if PPL_OR_MATRIX_EXTRA_DEBUG
-  value.size_ = static_cast<dimension_type>(static_cast<difference_type>(value.size_) + m - m % 2);
+  difference_type value_size_dt = static_cast<difference_type>(value.size_);
+  value_size_dt += (m - m % 2);
+  value.size_ = static_cast<dimension_type>(value_size_dt);
 #endif
   return *this;
 }
@@ -262,7 +268,7 @@ inline typename
 Enable_If<(static_cast<Unsigned>(-1) > 0),
             typename OR_Matrix<T>::template any_row_iterator<U>& >::type
 OR_Matrix<T>::any_row_iterator<U>::operator+=(Unsigned m) {
-  dimension_type increment = m + m * m / 2 + m * e;
+  dimension_type increment = m + (m * m / 2) + (m * e);
   if (e % 2 == 0 && m % 2 != 0)
     ++increment;
   e += m;
diff --git a/src/checked_float.inlines.hh b/src/checked_float.inlines.hh
index 08b7251..7f261a2 100644
--- a/src/checked_float.inlines.hh
+++ b/src/checked_float.inlines.hh
@@ -880,9 +880,10 @@ assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir) {
       return set_pos_overflow_float<To_Policy>(to, dir);
   }
   unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
-  if (exponent < Float<T>::Binary::EXPONENT_MIN)
-    needed_bits -= static_cast<unsigned int>(Float<T>::Binary::EXPONENT_MIN
-                                             - exponent);
+  if (exponent < Float<T>::Binary::EXPONENT_MIN) {
+    long diff = Float<T>::Binary::EXPONENT_MIN - exponent;
+    needed_bits -= static_cast<unsigned int>(diff);
+  }
   mpz_t mantissa;
   mpz_init(mantissa);
   {




More information about the PPL-devel mailing list