[GIT] ppl/ppl(master): Restore the pre-PPL rounding mode before using libm functions.
Module: ppl/ppl Branch: master Commit: 25f38f85a3fb07b98650bbe340574835ece94fe3 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=25f38f85a3fb0...
Author: Roberto Bagnara bagnara@cs.unipr.it Date: Thu Jun 21 17:41:01 2012 +0200
Restore the pre-PPL rounding mode before using libm functions.
---
tests/Box/interval1.cc | 13 ++++++++++--- tests/Box/membytes1.cc | 11 +++++++++-- tests/Polyhedron/randphull1.cc | 7 +++++++ 3 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/tests/Box/interval1.cc b/tests/Box/interval1.cc index ff5fae7..4c59a54 100644 --- a/tests/Box/interval1.cc +++ b/tests/Box/interval1.cc @@ -115,9 +115,16 @@ solve(const std::vector<N>& P, // Initial estimates are given by roots of unity. std::vector<std::complex<N> > x(5); double theta = 2*M_PI/degree; - for (int i = 0; i < degree; ++i) - x[i] = std::complex<N>(N(cos(i*theta)), - N(sin(i*theta))); + for (int i = 0; i < degree; ++i) { + // Many libm implementations only work with round-to-nearest. + // See, e.g, http://sources.redhat.com/bugzilla/show_bug.cgi?id=3976 + restore_pre_PPL_rounding(); + N cos_i_theta = N(cos(i*theta)); + N sin_i_theta = N(sin(i*theta)); + set_rounding_for_PPL(); + + x[i] = std::complex<N>(cos_i_theta, sin_i_theta); + }
for (int iteration = 0; iteration < 50; ++iteration) { for (int i = 0; i < degree; ++i) diff --git a/tests/Box/membytes1.cc b/tests/Box/membytes1.cc index 8a0093b..4649659 100644 --- a/tests/Box/membytes1.cc +++ b/tests/Box/membytes1.cc @@ -75,9 +75,16 @@ bool test02() { ix.join_assign(boundary_type(d-0.015)); ix.join_assign(boundary_type(d+0.015));
+ // Many libm implementations only work with round-to-nearest. + // See, e.g, http://sources.redhat.com/bugzilla/show_bug.cgi?id=3976 + restore_pre_PPL_rounding(); + boundary_type sdm = boundary_type(sin(d-0.015)); + boundary_type sdp = boundary_type(sin(d-0.015)); + set_rounding_for_PPL(); + iy.assign(EMPTY); - iy.join_assign(boundary_type(sin(d-0.015))); - iy.join_assign(boundary_type(sin(d+0.015))); + iy.join_assign(sdm); + iy.join_assign(sdp);
box.set_interval(x, ix); box.set_interval(y, iy); diff --git a/tests/Polyhedron/randphull1.cc b/tests/Polyhedron/randphull1.cc index 6fab90a..44103a5 100644 --- a/tests/Polyhedron/randphull1.cc +++ b/tests/Polyhedron/randphull1.cc @@ -98,6 +98,11 @@ point_on_the_unit_n_sphere(unsigned n, const std::vector<float>& theta, std::vector<float>& coordinate) { assert(n >= 2); + + // Many libm implementations only work with round-to-nearest. + // See, e.g, http://sources.redhat.com/bugzilla/show_bug.cgi?id=3976 + restore_pre_PPL_rounding(); + if (n == 2) { coordinate[0] *= sin(theta[0]); coordinate[1] *= cos(theta[0]); @@ -109,6 +114,8 @@ point_on_the_unit_n_sphere(unsigned n, coordinate[i] *= sin_theta_n_2; coordinate[n-1] *= cos(theta[n-2]); } + + set_rounding_for_PPL(); }
void
participants (1)
-
Roberto Bagnara