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));
         }
     }
 }

Attachment: signature.asc
Description: Digital signature

Reply via email to