
Module: ppl/ppl Branch: floating_point Commit: 500981d998d62c82210b01b5c22994e9c7ef1f4b URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=500981d998d62...
Author: Fabio Bossi bossi@cs.unipr.it Date: Tue Oct 5 10:51:03 2010 +0200
Never add a rounding error when casting the 0 value.
---
src/linearize.hh | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/src/linearize.hh b/src/linearize.hh index 8767f80..5374a93 100644 --- a/src/linearize.hh +++ b/src/linearize.hh @@ -600,8 +600,12 @@ cast_linearize(const Cast_Operator<Target>& cast_expr, if (!linearize(*cast_arg, oracle, lf_store, result)) return false; if (!is_less_precise_than(analyzed_format, - cast_arg->type().floating_point_format())) - // We are casting to a more precise format. Do not add errors. + cast_arg->type().floating_point_format()) || + result == FP_Linear_Form(FP_Interval_Type(0))) + /* + We are casting to a more precise format or casting the 0 value. + Do not add errors. + */ return true; } else { @@ -609,8 +613,12 @@ cast_linearize(const Cast_Operator<Target>& cast_expr, if (!oracle.get_integer_expr_value(*cast_arg, expr_value)) return false; result = FP_Linear_Form(expr_value); - 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. + if (is_less_precise_than(Float<analyzer_format>::Binary::floating_point_format, analyzed_format) || + result == FP_Linear_Form(FP_Interval_Type(0))) + /* + We are casting to a more precise format or casting the 0 value. + Do not add errors. + */ return true; }