core_func_exponential.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include <glm/common.hpp>
  2. #include <glm/exponential.hpp>
  3. #include <glm/gtc/epsilon.hpp>
  4. #include <glm/gtc/constants.hpp>
  5. #include <glm/gtc/ulp.hpp>
  6. #include <glm/gtc/vec1.hpp>
  7. static int test_pow()
  8. {
  9. int Error(0);
  10. float A = glm::pow(2.f, 2.f);
  11. Error += glm::epsilonEqual(A, 4.f, 0.01f) ? 0 : 1;
  12. glm::vec1 B = glm::pow(glm::vec1(2.f), glm::vec1(2.f));
  13. Error += glm::all(glm::epsilonEqual(B, glm::vec1(4.f), 0.01f)) ? 0 : 1;
  14. glm::vec2 C = glm::pow(glm::vec2(2.f), glm::vec2(2.f));
  15. Error += glm::all(glm::epsilonEqual(C, glm::vec2(4.f), 0.01f)) ? 0 : 1;
  16. glm::vec3 D = glm::pow(glm::vec3(2.f), glm::vec3(2.f));
  17. Error += glm::all(glm::epsilonEqual(D, glm::vec3(4.f), 0.01f)) ? 0 : 1;
  18. glm::vec4 E = glm::pow(glm::vec4(2.f), glm::vec4(2.f));
  19. Error += glm::all(glm::epsilonEqual(E, glm::vec4(4.f), 0.01f)) ? 0 : 1;
  20. return Error;
  21. }
  22. static int test_exp()
  23. {
  24. int Error = 0;
  25. float A = glm::exp(10.f);
  26. glm::vec1 B = glm::exp(glm::vec1(10.f));
  27. glm::vec2 C = glm::exp(glm::vec2(10.f));
  28. glm::vec3 D = glm::exp(glm::vec3(10.f));
  29. glm::vec4 E = glm::exp(glm::vec4(10.f));
  30. return Error;
  31. }
  32. static int test_log()
  33. {
  34. int Error = 0;
  35. float const A = glm::log(glm::e<float>());
  36. Error += glm::epsilonEqual(A, 1.f, 0.01f) ? 0 : 1;
  37. glm::vec1 const B = glm::log(glm::vec1(glm::e<float>()));
  38. Error += glm::all(glm::epsilonEqual(B, glm::vec1(1.f), 0.01f)) ? 0 : 1;
  39. glm::vec2 const C = glm::log(glm::vec2(glm::e<float>()));
  40. Error += glm::all(glm::epsilonEqual(C, glm::vec2(1.f), 0.01f)) ? 0 : 1;
  41. glm::vec3 const D = glm::log(glm::vec3(glm::e<float>()));
  42. Error += glm::all(glm::epsilonEqual(D, glm::vec3(1.f), 0.01f)) ? 0 : 1;
  43. glm::vec4 const E = glm::log(glm::vec4(glm::e<float>()));
  44. Error += glm::all(glm::epsilonEqual(E, glm::vec4(1.f), 0.01f)) ? 0 : 1;
  45. return Error;
  46. }
  47. static int test_exp2()
  48. {
  49. int Error = 0;
  50. float A = glm::exp2(10.f);
  51. glm::vec1 B = glm::exp2(glm::vec1(10.f));
  52. glm::vec2 C = glm::exp2(glm::vec2(10.f));
  53. glm::vec3 D = glm::exp2(glm::vec3(10.f));
  54. glm::vec4 E = glm::exp2(glm::vec4(10.f));
  55. return Error;
  56. }
  57. static int test_log2()
  58. {
  59. int Error = 0;
  60. float A = glm::log2(10.f);
  61. glm::vec1 B = glm::log2(glm::vec1(10.f));
  62. glm::vec2 C = glm::log2(glm::vec2(10.f));
  63. glm::vec3 D = glm::log2(glm::vec3(10.f));
  64. glm::vec4 E = glm::log2(glm::vec4(10.f));
  65. return Error;
  66. }
  67. static int test_sqrt()
  68. {
  69. int Error = 0;
  70. # if GLM_ARCH & GLM_ARCH_SSE2_BIT
  71. for(float f = 0.1f; f < 30.0f; f += 0.1f)
  72. {
  73. float r = _mm_cvtss_f32(_mm_sqrt_ps(_mm_set1_ps(f)));
  74. float s = std::sqrt(f);
  75. Error += glm::abs(r - s) < 0.01f ? 0 : 1;
  76. assert(!Error);
  77. }
  78. # endif//GLM_ARCH & GLM_ARCH_SSE2_BIT
  79. float A = glm::sqrt(10.f);
  80. glm::vec1 B = glm::sqrt(glm::vec1(10.f));
  81. glm::vec2 C = glm::sqrt(glm::vec2(10.f));
  82. glm::vec3 D = glm::sqrt(glm::vec3(10.f));
  83. glm::vec4 E = glm::sqrt(glm::vec4(10.f));
  84. return Error;
  85. }
  86. static int test_inversesqrt()
  87. {
  88. int Error = 0;
  89. glm::uint ulp(0);
  90. float diff(0.0f);
  91. for(float f = 0.001f; f < 10.f; f *= 1.01f)
  92. {
  93. glm::lowp_fvec1 u(f);
  94. glm::lowp_fvec1 lowp_v = glm::inversesqrt(u);
  95. float defaultp_v = glm::inversesqrt(f);
  96. ulp = glm::max(glm::float_distance(lowp_v.x, defaultp_v), ulp);
  97. diff = glm::abs(lowp_v.x - defaultp_v);
  98. Error += diff > 0.1f ? 1 : 0;
  99. }
  100. return Error;
  101. }
  102. int main()
  103. {
  104. int Error = 0;
  105. Error += test_pow();
  106. Error += test_exp();
  107. Error += test_log();
  108. Error += test_exp2();
  109. Error += test_log2();
  110. //Error += test_sqrt();
  111. //Error += test_inversesqrt();
  112. return Error;
  113. }