gtx_integer.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <glm/exponential.hpp>
  2. #include <glm/gtc/epsilon.hpp>
  3. #include <glm/gtx/integer.hpp>
  4. #include <cstdio>
  5. /*
  6. int test_floor_log2()
  7. {
  8. int Error = 0;
  9. for(std::size_t i = 1; i < 1000000; ++i)
  10. {
  11. glm::uint A = glm::floor_log2(glm::uint(i));
  12. glm::uint B = glm::uint(glm::floor(glm::log2(double(i)))); // Will fail with float, lack of accuracy
  13. Error += A == B ? 0 : 1;
  14. assert(!Error);
  15. }
  16. return Error;
  17. }
  18. */
  19. int test_log2()
  20. {
  21. int Error = 0;
  22. for(std::size_t i = 1; i < 24; ++i)
  23. {
  24. glm::uint A = glm::log2(glm::uint(1 << i));
  25. glm::uint B = glm::uint(glm::log2(double(1 << i)));
  26. //Error += glm::equalEpsilon(double(A), B, 1.0) ? 0 : 1;
  27. Error += glm::abs(double(A) - B) <= 24 ? 0 : 1;
  28. assert(!Error);
  29. printf("Log2(%d) error A=%d, B=%d\n", 1 << i, A, B);
  30. }
  31. printf("log2 error=%d\n", Error);
  32. return Error;
  33. }
  34. int test_nlz()
  35. {
  36. int Error = 0;
  37. for(glm::uint i = 1; i < glm::uint(33); ++i)
  38. Error += glm::nlz(i) == glm::uint(31u) - glm::findMSB(i) ? 0 : 1;
  39. //printf("%d, %d\n", glm::nlz(i), 31u - glm::findMSB(i));
  40. return Error;
  41. }
  42. int main()
  43. {
  44. int Error = 0;
  45. Error += test_nlz();
  46. // Error += test_floor_log2();
  47. Error += test_log2();
  48. return Error;
  49. }