From c6ac1e5e2c8574d7368777dbaf07aba1d41d984b Mon Sep 17 00:00:00 2001 From: Jeff Wang Date: Wed, 27 Jan 2021 21:11:32 -0500 Subject: [PATCH] add random tests for inverse trigonometric functions --- src/decn/decn_tests_trig.cpp | 97 ++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp index 3217287..af1166d 100644 --- a/src/decn/decn_tests_trig.cpp +++ b/src/decn/decn_tests_trig.cpp @@ -377,3 +377,100 @@ TEST_CASE("tan random"){ } } } + +TEST_CASE("atan random"){ + std::default_random_engine gen; + std::uniform_int_distribution distrib(0, 99); + std::uniform_int_distribution exp_distrib(-1, 0); //restrict range for now + std::uniform_int_distribution sign_distrib(0, 1); + for (int j = 0; j < NUM_RAND_TRIG_TESTS; j++){ + for (int i = 0; i < DEC80_NUM_LSU; i++){ + AccDecn.lsu[i] = distrib(gen); + } + int exp = exp_distrib(gen); + int sign = sign_distrib(gen); + set_exponent(&AccDecn, exp, sign); + remove_leading_zeros(&AccDecn); + int lsu0 = AccDecn.lsu[0]; + exp = get_exponent(&AccDecn); + CAPTURE(lsu0); + CAPTURE(exp); + CAPTURE(sign); + if (exp <= -6){ + //extremely small + atan_test(10000); + } else if (exp < -1 || (exp == -1 && lsu0 == 0)){ + //very small + atan_test(100); + } else if ((exp == -1 && lsu0 < 10) || (exp == 0 && lsu0 == 0)){ + //small + atan_test(3); + } else { + atan_test(0.02); + } + } +} + +TEST_CASE("asin random"){ + std::default_random_engine gen; + std::uniform_int_distribution distrib(0, 99); + std::uniform_int_distribution exp_distrib(-2, -1); //restrict range for now + std::uniform_int_distribution sign_distrib(0, 1); + for (int j = 0; j < NUM_RAND_TRIG_TESTS; j++){ + for (int i = 0; i < DEC80_NUM_LSU; i++){ + AccDecn.lsu[i] = distrib(gen); + } + int exp = exp_distrib(gen); + int sign = sign_distrib(gen); + set_exponent(&AccDecn, exp, sign); + remove_leading_zeros(&AccDecn); + int lsu0 = AccDecn.lsu[0]; + exp = get_exponent(&AccDecn); + CAPTURE(lsu0); + CAPTURE(exp); + CAPTURE(sign); + if (exp <= -7) { + //extremely small + asin_test(50000); + } else if (exp < -5) { + //very very small + asin_test(1000); + } else if (exp < -1 || (exp == -1 && lsu0 == 0)){ + //very small + asin_test(100); + } else if ((exp == -1 && lsu0 < 10) || (exp == 0 && lsu0 == 0)){ + //small + asin_test(0.5); + } else { + asin_test(0.02); + } + } +} + + +TEST_CASE("acos random"){ + std::default_random_engine gen; + std::uniform_int_distribution distrib(0, 99); + std::uniform_int_distribution exp_distrib(-2, -1); //restrict range for now + std::uniform_int_distribution sign_distrib(0, 1); + for (int j = 0; j < NUM_RAND_TRIG_TESTS; j++){ + for (int i = 0; i < DEC80_NUM_LSU; i++){ + AccDecn.lsu[i] = distrib(gen); + } + int exp = exp_distrib(gen); + int sign = sign_distrib(gen); + set_exponent(&AccDecn, exp, sign); + remove_leading_zeros(&AccDecn); + int lsu0 = AccDecn.lsu[0]; + exp = get_exponent(&AccDecn); + CAPTURE(lsu0); + CAPTURE(exp); + CAPTURE(sign); + if ((exp == -1 && lsu0 == 99)){ + //near 1 + acos_test(10); + } else { + acos_test(0.02); + } + } +}