diff --git a/tests/unit_circle_test.cc b/tests/unit_circle_test.cc index fc2d9a1..f5c0d96 100644 --- a/tests/unit_circle_test.cc +++ b/tests/unit_circle_test.cc @@ -15,7 +15,7 @@ template void test(int MAX) { for (int N = 1; N <= MAX; ++N) { - for (int n = 0; n < N; ++n) { + for (int n = -N; n <= N; ++n) { PRECISE x = DSP::Const::TwoPi() * PRECISE(n) / PRECISE(N); PRECISE cos_err = std::abs(DSP::UnitCircle::cos(n, N) - std::cos(x)); assert(cos_err < std::numeric_limits::epsilon()); diff --git a/unit_circle.hh b/unit_circle.hh index 0df6b85..67e6cbd 100644 --- a/unit_circle.hh +++ b/unit_circle.hh @@ -56,6 +56,10 @@ public: static constexpr TYPE cos(int n, int N) { return + 8*n <-7*N ? cosine_approx(rad(n+N, N)) : + 8*n <-5*N ? -sine_approx(rad(4*n+3*N, 4*N)) : + 8*n <-3*N ? -cosine_approx(rad(2*n+N, 2*N)) : + 8*n <-1*N ? sine_approx(rad(4*n+N, 4*N)) : 8*n < 1*N ? cosine_approx(rad(n, N)) : 8*n < 3*N ? -sine_approx(rad(4*n-N, 4*N)) : 8*n < 5*N ? -cosine_approx(rad(2*n-N, 2*N)) : @@ -65,6 +69,10 @@ public: static constexpr TYPE sin(int n, int N) { return + 8*n <-7*N ? sine_approx(rad(n+N, N)) : + 8*n <-5*N ? cosine_approx(rad(4*n+3*N, 4*N)) : + 8*n <-3*N ? -sine_approx(rad(2*n+N, 2*N)) : + 8*n <-1*N ? -cosine_approx(rad(4*n+N, 4*N)) : 8*n < 1*N ? sine_approx(rad(n, N)) : 8*n < 3*N ? cosine_approx(rad(4*n-N, 4*N)) : 8*n < 5*N ? -sine_approx(rad(2*n-N, 2*N)) :