[PPL-devel] [GIT] ppl/ppl(floating_point): Use build method instead of join_assign to build convex intervals.
Roberto Amadini
r.amadini at virgilio.it
Sat Feb 20 14:43:10 CET 2010
Module: ppl/ppl
Branch: floating_point
Commit: bdae3bb7bff529ab9864b997f66507f20db38719
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=bdae3bb7bff529ab9864b997f66507f20db38719
Author: Roberto Amadini <r.amadini at virgilio.it>
Date: Sat Feb 20 14:39:08 2010 +0100
Use build method instead of join_assign to build convex intervals.
---
src/Cast_Floating_Point_Expression.templates.hh | 6 +++---
src/Constant_Floating_Point_Expression.defs.hh | 2 --
src/Constant_Floating_Point_Expression.inlines.hh | 7 +++----
...fference_Floating_Point_Expression.templates.hh | 6 +++---
...Division_Floating_Point_Expression.templates.hh | 6 +++---
src/Floating_Point_Expression.templates.hh | 14 ++++++++------
...lication_Floating_Point_Expression.templates.hh | 6 +++---
src/Sum_Floating_Point_Expression.templates.hh | 6 +++---
tests/Floating_Point_Expression/digitalfilters1.cc | 6 +++---
9 files changed, 29 insertions(+), 30 deletions(-)
diff --git a/src/Cast_Floating_Point_Expression.templates.hh b/src/Cast_Floating_Point_Expression.templates.hh
index 671886c..b4c5ba8 100644
--- a/src/Cast_Floating_Point_Expression.templates.hh
+++ b/src/Cast_Floating_Point_Expression.templates.hh
@@ -36,9 +36,9 @@ bool Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
FP_Linear_Form rel_error;
relative_error(result, rel_error);
result += rel_error;
- FP_Interval_Type abs_error(-this->absolute_error);
- // FIXME: this may be incorrect for some policies.
- abs_error.join_assign(this->absolute_error);
+ FP_Interval_Type abs_error;
+ abs_error.build(i_constraint(GREATER_OR_EQUAL, -this->absolute_error),
+ i_constraint(LESS_OR_EQUAL, this->absolute_error));
result += abs_error;
return !this->overflows(result);
}
diff --git a/src/Constant_Floating_Point_Expression.defs.hh b/src/Constant_Floating_Point_Expression.defs.hh
index 5f27a12..5036e75 100644
--- a/src/Constant_Floating_Point_Expression.defs.hh
+++ b/src/Constant_Floating_Point_Expression.defs.hh
@@ -151,8 +151,6 @@ public:
private:
- // FIXME: this is a temporary solution: we should find a way to convert
- // a floating point with an arbitrary format to an interval.
FP_Interval_Type value;
#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
diff --git a/src/Constant_Floating_Point_Expression.inlines.hh b/src/Constant_Floating_Point_Expression.inlines.hh
index df9c051..a3bd5a9 100644
--- a/src/Constant_Floating_Point_Expression.inlines.hh
+++ b/src/Constant_Floating_Point_Expression.inlines.hh
@@ -37,11 +37,10 @@ template <typename FP_Interval_Type, typename FP_Format>
inline
Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
Constant_Floating_Point_Expression(const boundary_type lb,
- const boundary_type ub)
- : value(lb) {
+ const boundary_type ub) {
assert(lb <= ub);
- // FIXME: this may be incorrect for some policies.
- value.join_assign(ub);
+ value.build(i_constraint(GREATER_OR_EQUAL, lb),
+ i_constraint(LESS_OR_EQUAL, ub));
}
template <typename FP_Interval_Type, typename FP_Format>
diff --git a/src/Difference_Floating_Point_Expression.templates.hh b/src/Difference_Floating_Point_Expression.templates.hh
index d9cd388..4323d4e 100644
--- a/src/Difference_Floating_Point_Expression.templates.hh
+++ b/src/Difference_Floating_Point_Expression.templates.hh
@@ -43,9 +43,9 @@ bool Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
result -= linearized_second_operand;
relative_error(linearized_second_operand, rel_error);
result += rel_error;
- FP_Interval_Type abs_error(-this->absolute_error);
- // FIXME: this may be incorrect for some policies.
- abs_error.join_assign(this->absolute_error);
+ FP_Interval_Type abs_error;
+ abs_error.build(i_constraint(GREATER_OR_EQUAL, -this->absolute_error),
+ i_constraint(LESS_OR_EQUAL, this->absolute_error));
result += abs_error;
return !this->overflows(result);
}
diff --git a/src/Division_Floating_Point_Expression.templates.hh b/src/Division_Floating_Point_Expression.templates.hh
index 5de000e..ac87ecb 100644
--- a/src/Division_Floating_Point_Expression.templates.hh
+++ b/src/Division_Floating_Point_Expression.templates.hh
@@ -51,9 +51,9 @@ bool Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
result /= intervalized_second_operand;
rel_error /= intervalized_second_operand;
result += rel_error;
- FP_Interval_Type abs_error(-this->absolute_error);
- // FIXME: this may be incorrect for some policies.
- abs_error.join_assign(this->absolute_error);
+ FP_Interval_Type abs_error;
+ abs_error.build(i_constraint(GREATER_OR_EQUAL, -this->absolute_error),
+ i_constraint(LESS_OR_EQUAL, this->absolute_error));
result += abs_error;
return !this->overflows(result);
}
diff --git a/src/Floating_Point_Expression.templates.hh b/src/Floating_Point_Expression.templates.hh
index 62d5515..d8ab3fa 100644
--- a/src/Floating_Point_Expression.templates.hh
+++ b/src/Floating_Point_Expression.templates.hh
@@ -33,14 +33,16 @@ template<typename FP_Interval_Type, typename FP_Format>
void
Floating_Point_Expression<FP_Interval_Type, FP_Format>
::relative_error(const FP_Linear_Form& lf, FP_Linear_Form& result) {
- /* FIXME: here we assume that boundary_type can represent
- (2)^(-FP_Format::MANTISSA_BITS) precisely. */
- FP_Interval_Type error_propagator(-pow(FP_Format::BASE,
+
+ FP_Interval_Type error_propagator;
+ error_propagator.build(
+ i_constraint(GREATER_OR_EQUAL, -pow(FP_Format::BASE,
-static_cast<typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
- ::boundary_type>(FP_Format::MANTISSA_BITS)));
- error_propagator.join_assign(FP_Interval_Type(pow(FP_Format::BASE,
+ ::boundary_type>(FP_Format::MANTISSA_BITS))),
+ i_constraint(LESS_OR_EQUAL, pow(FP_Format::BASE,
-static_cast<typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
- ::boundary_type>(FP_Format::MANTISSA_BITS))));
+ ::boundary_type>(FP_Format::MANTISSA_BITS)))
+ );
// Handle the inhomogeneous term.
const FP_Interval_Type* current_term = &lf.inhomogeneous_term();
diff --git a/src/Multiplication_Floating_Point_Expression.templates.hh b/src/Multiplication_Floating_Point_Expression.templates.hh
index 3922983..c15fdb8 100644
--- a/src/Multiplication_Floating_Point_Expression.templates.hh
+++ b/src/Multiplication_Floating_Point_Expression.templates.hh
@@ -98,9 +98,9 @@ bool Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
result += linearized_first_operand;
}
- FP_Interval_Type abs_error(-this->absolute_error);
- // FIXME: this may be incorrect for some policies.
- abs_error.join_assign(this->absolute_error);
+ FP_Interval_Type abs_error;
+ abs_error.build(i_constraint(GREATER_OR_EQUAL, -this->absolute_error),
+ i_constraint(LESS_OR_EQUAL, this->absolute_error));
result += abs_error;
return !this->overflows(result);
}
diff --git a/src/Sum_Floating_Point_Expression.templates.hh b/src/Sum_Floating_Point_Expression.templates.hh
index 2c01484..6758848 100644
--- a/src/Sum_Floating_Point_Expression.templates.hh
+++ b/src/Sum_Floating_Point_Expression.templates.hh
@@ -43,9 +43,9 @@ bool Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
result += linearized_second_operand;
relative_error(linearized_second_operand, rel_error);
result += rel_error;
- FP_Interval_Type abs_error(-this->absolute_error);
- // FIXME: this may be incorrect for some policies.
- abs_error.join_assign(this->absolute_error);
+ FP_Interval_Type abs_error;
+ abs_error.build(i_constraint(GREATER_OR_EQUAL, -this->absolute_error),
+ i_constraint(LESS_OR_EQUAL, this->absolute_error));
result += abs_error;
return !this->overflows(result);
}
diff --git a/tests/Floating_Point_Expression/digitalfilters1.cc b/tests/Floating_Point_Expression/digitalfilters1.cc
index 2f84d73..4a04f40 100644
--- a/tests/Floating_Point_Expression/digitalfilters1.cc
+++ b/tests/Floating_Point_Expression/digitalfilters1.cc
@@ -456,7 +456,7 @@ test05() {
cs.insert(Y <= M);
cs.insert(Y >= -M);
- Con_FP_Expression con_y(0, 0);
+ Con_FP_Expression con_y("0");
// The constant floating point expression con_y is linearized into
// the interval linear form lk. If linearization succeeded, we model
// the assignment Y = 0, invoking affine_form_image method.
@@ -627,7 +627,7 @@ test06() {
cs.insert(Y <= N);
cs.insert(Y >= -N);
- Con_FP_Expression con_y(0, 0);
+ Con_FP_Expression con_y("0");
// The constant floating point expression con_y is linearized into
// the interval linear form lk. If linearization succeeded, we model
// the assignment Y = 0, invoking affine_form_image method.
@@ -795,7 +795,7 @@ test07() {
cs.insert(Y <= M);
cs.insert(Y >= -M);
- Con_FP_Expression con_y(0, 0);
+ Con_FP_Expression con_y("0");
// The constant floating point expression con_y is linearized into
// the interval linear form lk. If linearization succeeded, we model
// the assignment Y = 0, invoking affine_form_image method.
More information about the PPL-devel
mailing list