fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstddef>
  4. #include <cmath>
  5.  
  6.  
  7. auto const pi = std::acos(-1.f);
  8.  
  9. struct sin_table {
  10.  
  11. explicit sin_table(float const step) : step(step) {
  12. auto const size = static_cast<std::size_t>(2 * pi / step);
  13.  
  14. table.resize(size);
  15.  
  16. for (std::size_t i = 0; i != size; ++i) {
  17. table[i] = std::sin(i * step);
  18. }
  19. }
  20.  
  21. float operator ()(float const arg) const {
  22. auto const pos = static_cast<std::size_t>(std::abs(arg / step)) % table.size();
  23. auto const value = table[pos];
  24. return std::signbit(arg) ? -value : value;
  25. }
  26.  
  27. private:
  28. float const step;
  29. std::vector<float> table;
  30. };
  31.  
  32.  
  33. int main() {
  34. sin_table const sin(.01f);
  35.  
  36. std::cout << sin(.0f) << std::endl;
  37. std::cout << sin(pi / 2) << std::endl;
  38. std::cout << sin(pi) << std::endl;
  39. std::cout << sin(3 * pi / 2) << std::endl;
  40. std::cout << sin(5 * pi / 2) << std::endl;
  41. std::cout << sin(-pi / 2) << std::endl;
  42. std::cout << sin(-3 * pi / 2) << std::endl;
  43. std::cout << sin(-5 * pi / 2) << std::endl;
  44. }
  45.  
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
0
1
0.00159279
-0.999997
1
-1
0.999997
-1