[GIT] ppl/ppl(floating_point): Improved Multiplication_Floating_Point_Expression::linearize.

Module: ppl/ppl Branch: floating_point Commit: 7bfd19aec5b224dab0d853f4904f5118e8c77fde URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=7bfd19aec5b22...
Author: Roberto Amadini r.amadini@virgilio.it Date: Mon Dec 28 14:21:22 2009 +0100
Improved Multiplication_Floating_Point_Expression::linearize.
---
...lication_Floating_Point_Expression.templates.hh | 33 ++++++++++++++------ 1 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/src/Multiplication_Floating_Point_Expression.templates.hh b/src/Multiplication_Floating_Point_Expression.templates.hh index fdda55e..f1fc29f 100644 --- a/src/Multiplication_Floating_Point_Expression.templates.hh +++ b/src/Multiplication_Floating_Point_Expression.templates.hh @@ -55,19 +55,32 @@ void Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format> boundary_type first_interval_size, second_interval_size;
// FIXME: we are not sure that what we do here is policy-proof. - if (intervalized_first_operand.is_bounded() - && intervalized_second_operand.is_bounded()) { - first_interval_size = intervalized_first_operand.upper() - - intervalized_first_operand.lower(); - second_interval_size = intervalized_second_operand.upper() - - intervalized_second_operand.lower(); - if (first_interval_size <= second_interval_size) + if (intervalized_first_operand.is_bounded()) { + if (intervalized_second_operand.is_bounded()) { + first_interval_size = intervalized_first_operand.upper() - + intervalized_first_operand.lower(); + second_interval_size = intervalized_second_operand.upper() - + intervalized_second_operand.lower(); + if (first_interval_size <= second_interval_size) + intervalize_first = true; + else + intervalize_first = false; + } + else { + if (this->overflows(linearized_second_operand)) + throw Linearization_Failed(); intervalize_first = true; - else + } + } + else { + if (intervalized_second_operand.is_bounded()) { + if (this->overflows(linearized_first_operand)) + throw Linearization_Failed(); intervalize_first = false; + } + else + throw Linearization_Failed(); } - else - throw Linearization_Failed();
// Here we do the actual computation. // For optimizing, we store the relative error directly into result.
participants (1)
-
Roberto Amadini