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