tags 815712 + patch thanks Hi Mathieu!
Would you like to try my patches (attached) to fix the testsuite on 32-bit x86? Possibly some other 32-bit systems will need to be listed, although ARM seemed to be unaffected so far. Thanks, Regards, -- Steven Chamberlain ste...@pyro.eu.org
Subject: testBoxAlgo: allow fuzzy match of b12 == b2 From: Steven Chamberlain <ste...@pyro.eu.org> Date: Wed, 24 Feb 2016 01:04:11 +0000 Also fix a pre-existing typo. --- a/ImathTest/testBoxAlgo.cpp +++ b/ImathTest/testBoxAlgo.cpp @@ -886,10 +886,11 @@ assert (approximatelyEqual (b2.min, b4.min, e)); assert (approximatelyEqual (b2.max, b4.max, e)); - assert (approximatelyEqual (b3.max, b4.max, e)); + assert (approximatelyEqual (b3.min, b4.min, e)); assert (approximatelyEqual (b3.max, b4.max, e)); - assert (b21 == b2); + assert (approximatelyEqual (b2.min, b21.min, e)); + assert (approximatelyEqual (b2.max, b21.max, e)); assert (b31 == b3); M[0][3] = 1;
Subject: testBox: allow fuzzy comparison of floats, doubles From: Steven Chamberlain <ste...@pyro.eu.org> Date: Wed, 24 Feb 2016 01:10:11 +0000 Allow for inexact values, as long as the error is smaller than the epsilon of the data type. On 32-bit x86, allow even greater discrepency at double precision, due to possible double-rounding. See https://lists.nongnu.org/archive/html/openexr-devel/2015-12/msg00001.html --- a/ImathTest/testBox.cpp +++ b/ImathTest/testBox.cpp @@ -47,6 +47,58 @@ namespace { +template <class T> +bool +approximatelyEqual (const T &p1, const T &p2) +{ + /* int and short should be exact */ + return (p1 == p2); +} + +bool +approximatelyEqual (const Vec2<float> &p1, const Vec2<float> &p2) +{ + float e = limits<float>::epsilon(); + float m = 0; + + for (int i = 0; i < 2; ++i) + { + m = max (m, abs (p1[i])); + m = max (m, abs (p2[i])); + } + + for (int i = 0; i < 2; ++i) + if (!equalWithAbsError (p1[i], p2[i], m * e)) + return false; + + return true; +} + +bool +approximatelyEqual (const Vec2<double> &p1, const Vec2<double> &p2) +{ +#if defined(__i386__) || defined(_M_IX86) + /* double-rounding on 32-bit x86 may cause larger error: + use epsilon of float rather than double */ + double e = limits<float>::epsilon(); +#else + double e = limits<double>::epsilon(); +#endif + double m = 0; + + for (int i = 0; i < 2; ++i) + { + m = max (m, abs (p1[i])); + m = max (m, abs (p2[i])); + } + + for (int i = 0; i < 2; ++i) + if (!equalWithAbsError (p1[i], p2[i], m * e)) + return false; + + return true; +} + // // Test case generation utility - create a vector of IMATH_INTERNAL_NAMESPACE::Vec{2,3,4} // with all permutations of integers 1..T::dimensions(). @@ -250,7 +302,8 @@ IMATH_INTERNAL_NAMESPACE::Box<T> b; b.extendBy(p); - assert(b.min == p && b.max == p); + assert (approximatelyEqual (b.min, p)); + assert (approximatelyEqual (b.max, p)); } // @@ -283,7 +336,8 @@ b.extendBy(p); - assert(b.min == min && b.max == max); + assert (approximatelyEqual (b.min, min)); + assert (approximatelyEqual (b.max, max)); } } } @@ -358,7 +412,8 @@ } b.extendBy(IMATH_INTERNAL_NAMESPACE::Box<T>(p0, p1)); - assert(b.min == min && b.max == max); + assert (approximatelyEqual (b.min, min)); + assert (approximatelyEqual (b.max, max)); } } }
signature.asc
Description: Digital signature