
Module: ppl/ppl Branch: master Commit: 756ef076d4574278d3665d3885b7dc41526a2b81 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=756ef076d4574...
Author: Enea Zaffanella zaffanella@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); {