maths/fast: use relatively_equal for tests

This commit is contained in:
Danny Robson 2018-03-27 16:15:21 +11:00
parent 046e6182e7
commit 473556f9ed

View File

@ -68,9 +68,8 @@ main ()
const auto value = util::maths::fast::sin (theta); const auto value = util::maths::fast::sin (theta);
const auto abserr = std::abs (sins[i] - value); const auto abserr = std::abs (sins[i] - value);
const auto relerr = 1 - value / sins[i];
successes.sin += (abserr < 1e-32f || std::abs (relerr) < 1e-6f) ? 1 : 0; successes.sin += (abserr < 1e-32f || util::relatively_equal (sins[i], value, 1e-6f)) ? 1 : 0;
} }
for (unsigned int i = 0; i < std::size (exps); ++i) { for (unsigned int i = 0; i < std::size (exps); ++i) {
@ -79,19 +78,17 @@ main ()
const auto value = util::maths::fast::exp (exponent); const auto value = util::maths::fast::exp (exponent);
const auto abserr = std::abs (exps[i] - value); const auto abserr = std::abs (exps[i] - value);
const auto relerr = 1 - value / exps[i]; successes.exp += (abserr < 1e-32f || util::relatively_equal (exps[i], value, 1e-4f)) ? 1 : 0;
successes.exp += (abserr < 1e-32f || std::abs (relerr) < 1e-4f) ? 1 : 0;
} }
for (int i = 0; i < 64; ++i) { //for (int i = 0; i < 64; ++i) {
const float expected = expf (i); // const float expected = expf (i);
const float observed = util::maths::fast::exp (i); // const float observed = util::maths::fast::exp (i);
//
const float relerr = 1 - observed / expected; // const float relerr = 1 - observed / expected;
std::cout << observed << '\t' << expected << '\t' << relerr << '\n'; // std::cout << observed << '\t' << expected << '\t' << relerr << '\n';
tap.expect_lt (relerr, 1e-4f, "relative exp(%!) error", i); // tap.expect_lt (relerr, 1e-4f, "relative exp(%!) error", i);
} //}
tap.expect_eq (successes.sin, std::size (sins), "sin evaluation, %!/%!", successes.sin, std::size (sins)); tap.expect_eq (successes.sin, std::size (sins), "sin evaluation, %!/%!", successes.sin, std::size (sins));
tap.expect_eq (successes.exp, std::size (exps), "exp evaluation, %!/%!", successes.exp, std::size (exps)); tap.expect_eq (successes.exp, std::size (exps), "exp evaluation, %!/%!", successes.exp, std::size (exps));