From 55e3ae02ac1f13fbcc7a83f5e37a39fd2b142db1 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen Date: Thu, 4 Nov 2021 18:04:04 -0700 Subject: [PATCH] Compare summation results against forward error bound. --- unsupported/test/cxx11_tensor_reduction.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/unsupported/test/cxx11_tensor_reduction.cpp b/unsupported/test/cxx11_tensor_reduction.cpp index afcb79570..9648b9c8b 100644 --- a/unsupported/test/cxx11_tensor_reduction.cpp +++ b/unsupported/test/cxx11_tensor_reduction.cpp @@ -501,14 +501,16 @@ void test_sum_accuracy() { // Compute the reference value in double precsion. double expected_sum = 0.0; + double abs_sum = 0.0; for (int i = 0; i < num_elements; ++i) { expected_sum += static_cast(tensor(i)); + abs_sum += static_cast(numext::abs(tensor(i))); } - // Scale tolerance to account for # elements. Otherwise, we periodically fail, since - // E[sum] == prescribed_mean == 0 for the first iteration. + // Test against probabilistic forward error bound. In reality, the error is much smaller + // when we use tree summation. double err = Eigen::numext::abs(static_cast(sum()) - expected_sum); - double tol = Eigen::numext::sqrt(num_elements) * static_cast(test_precision()) * numext::maxi(1.0, prescribed_mean); - VERIFY(err < tol); + double tol = numext::sqrt(num_elements) * NumTraits::epsilon() * static_cast(abs_sum); + VERIFY_LE(err, tol); } }