#include <iostream>
#include <vector>
#include <cstddef>
#include <cmath>
auto const pi = std::acos(-1.f);
struct sin_table {
explicit sin_table(float const step) : step(step) {
auto const size = static_cast<std::size_t>(2 * pi / step);
table.resize(size);
for (std::size_t i = 0; i != size; ++i) {
table[i] = std::sin(i * step);
}
}
float operator ()(float const arg) const {
auto const pos = static_cast<std::size_t>(std::abs(arg / step)) % table.size();
auto const value = table[pos];
return std::signbit(arg) ? -value : value;
}
private:
float const step;
std::vector<float> table;
};
int main() {
sin_table const sin(.01f);
std::cout << sin(.0f) << std::endl;
std::cout << sin(pi / 2) << std::endl;
std::cout << sin(pi) << std::endl;
std::cout << sin(3 * pi / 2) << std::endl;
std::cout << sin(5 * pi / 2) << std::endl;
std::cout << sin(-pi / 2) << std::endl;
std::cout << sin(-3 * pi / 2) << std::endl;
std::cout << sin(-5 * pi / 2) << std::endl;
}