From 45795a1ae0fe8947c1e52b868bfb1f47bb236ee2 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Mon, 15 Aug 2016 20:54:01 +1000 Subject: [PATCH] quaternion: compare test results using sum-of-differences comparison of floating point values is inexact and there isn't an easy way for providing an ULP delta via the TAP interface. morever, the general expected error is too large to reliably express in ULPs. --- test/quaternion.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/test/quaternion.cpp b/test/quaternion.cpp index 3342855c..89132702 100644 --- a/test/quaternion.cpp +++ b/test/quaternion.cpp @@ -76,20 +76,23 @@ main (void) for (size_t i = 0; i < elems (ROTATIONS); ++i) { const auto &r = ROTATIONS[i]; - tap.expect_eq (quaternionf::rotation (r.mag, r.axis).as_matrix (), - util::matrix4f::rotation (r.mag, r.axis), - "single basis rotation %zu", i); + auto q = quaternionf::rotation (r.mag, r.axis).as_matrix (); + auto m = util::matrix4f::rotation (r.mag, r.axis); + auto diff = util::abs (q - m); + + tap.expect_lt (util::sum (diff), 1e-6f, "single basis rotation %zu", i); } - auto q_total = quaternionf::IDENTITY; - auto m_total = util::matrix4f::IDENTITY; + auto q = quaternionf::IDENTITY; + auto m = util::matrix4f::IDENTITY; for (auto r: ROTATIONS) { - q_total = q_total.rotation (r.mag, r.axis) * q_total; - m_total = m_total.rotation (r.mag, r.axis) * m_total; + q = q.rotation (r.mag, r.axis) * q; + m = m.rotation (r.mag, r.axis) * m; } - tap.expect_eq (q_total.as_matrix (), m_total, "chained single axis rotations"); + auto diff = util::abs (q.as_matrix () - m); + tap.expect_lt (util::sum (diff), 1e-6f, "chained single axis rotations"); } return tap.status ();