
Module: ppl/ppl Branch: floating_point Commit: 8cfeaf81d2f501d2040e6af07815763173d7357c URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=8cfeaf81d2f50...
Author: Fabio Bossi bossi@cs.unipr.it Date: Fri Jul 30 17:04:16 2010 +0200
Do not add errors after rounding to a less precise format.
---
src/Float.defs.hh | 6 ++++++ src/linearize.hh | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/Float.defs.hh b/src/Float.defs.hh index 75d2c2b..219e7d3 100644 --- a/src/Float.defs.hh +++ b/src/Float.defs.hh @@ -58,6 +58,7 @@ struct float_ieee754_half { static const int EXPONENT_MIN = -EXPONENT_MAX + 1; static const int EXPONENT_MIN_DENORM = EXPONENT_MIN - static_cast<int>(MANTISSA_BITS); + static const Floating_Point_Format floating_point_format = IEEE754_HALF; int is_inf() const; int is_nan() const; int is_zero() const; @@ -90,6 +91,7 @@ struct float_ieee754_single { static const int EXPONENT_MIN = -EXPONENT_MAX + 1; static const int EXPONENT_MIN_DENORM = EXPONENT_MIN - static_cast<int>(MANTISSA_BITS); + static const Floating_Point_Format floating_point_format = IEEE754_SINGLE; int is_inf() const; int is_nan() const; int is_zero() const; @@ -135,6 +137,7 @@ struct float_ieee754_double { static const int EXPONENT_MIN = -EXPONENT_MAX + 1; static const int EXPONENT_MIN_DENORM = EXPONENT_MIN - static_cast<int>(MANTISSA_BITS); + static const Floating_Point_Format floating_point_format = IEEE754_DOUBLE; int is_inf() const; int is_nan() const; int is_zero() const; @@ -166,6 +169,7 @@ struct float_ibm_single { static const int EXPONENT_MIN = -EXPONENT_MAX + 1; static const int EXPONENT_MIN_DENORM = EXPONENT_MIN - static_cast<int>(MANTISSA_BITS); + static const Floating_Point_Format floating_point_format = IBM_SINGLE; int is_inf() const; int is_nan() const; int is_zero() const; @@ -217,6 +221,8 @@ struct float_intel_double_extended { static const int EXPONENT_MIN = -EXPONENT_MAX + 1; static const int EXPONENT_MIN_DENORM = EXPONENT_MIN - static_cast<int>(MANTISSA_BITS); + static const Floating_Point_Format floating_point_format = + INTEL_DOUBLE_EXTENDED; int is_inf() const; int is_nan() const; int is_zero() const; diff --git a/src/linearize.hh b/src/linearize.hh index 0093586..d21e5cb 100644 --- a/src/linearize.hh +++ b/src/linearize.hh @@ -629,8 +629,9 @@ cast_linearize(const Cast_Operator<Target>& cast_expr, } else { result = FP_Linear_Form(FP_Interval_Type(cast_arg->get_integer_interval())); - /* FIXME: we can avoid adding errors if FP_Interval_Type::boundary_type - is less precise than analyzed_format. */ + if (is_less_precise_than(Float<analyzer_format>::Binary::floating_point_format, analyzed_format)) + // We are rounding to a less precise format. Do not add errors. + return true; }
FP_Linear_Form rel_error;