gtc_ulp.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. // OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////
  4. // Created : 2011-04-26
  5. // Updated : 2011-04-26
  6. // Licence : This source is under MIT licence
  7. // File : test/gtc/ulp.cpp
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////
  9. #include <glm/gtc/ulp.hpp>
  10. #include <iostream>
  11. #include <limits>
  12. int test_ulp_float_dist()
  13. {
  14. int Error = 0;
  15. float A = 1.0f;
  16. float B = glm::next_float(A);
  17. Error += A != B ? 0 : 1;
  18. float C = glm::prev_float(B);
  19. Error += A == C ? 0 : 1;
  20. int D = glm::float_distance(A, B);
  21. Error += D == 1 ? 0 : 1;
  22. int E = glm::float_distance(A, C);
  23. Error += E == 0 ? 0 : 1;
  24. return Error;
  25. }
  26. int test_ulp_float_step()
  27. {
  28. int Error = 0;
  29. float A = 1.0f;
  30. for(int i = 10; i < 1000; i *= 10)
  31. {
  32. float B = glm::next_float(A, i);
  33. Error += A != B ? 0 : 1;
  34. float C = glm::prev_float(B, i);
  35. Error += A == C ? 0 : 1;
  36. int D = glm::float_distance(A, B);
  37. Error += D == i ? 0 : 1;
  38. int E = glm::float_distance(A, C);
  39. Error += E == 0 ? 0 : 1;
  40. }
  41. return Error;
  42. }
  43. int test_ulp_double_dist()
  44. {
  45. int Error = 0;
  46. double A = 1.0;
  47. double B = glm::next_float(A);
  48. Error += A != B ? 0 : 1;
  49. double C = glm::prev_float(B);
  50. Error += A == C ? 0 : 1;
  51. int D = glm::float_distance(A, B);
  52. Error += D == 1 ? 0 : 1;
  53. int E = glm::float_distance(A, C);
  54. Error += E == 0 ? 0 : 1;
  55. return Error;
  56. }
  57. int test_ulp_double_step()
  58. {
  59. int Error = 0;
  60. double A = 1.0;
  61. for(int i = 10; i < 1000; i *= 10)
  62. {
  63. double B = glm::next_float(A, i);
  64. Error += A != B ? 0 : 1;
  65. double C = glm::prev_float(B, i);
  66. Error += A == C ? 0 : 1;
  67. int D = glm::float_distance(A, B);
  68. Error += D == i ? 0 : 1;
  69. int E = glm::float_distance(A, C);
  70. Error += E == 0 ? 0 : 1;
  71. }
  72. return Error;
  73. }
  74. int main()
  75. {
  76. int Error = 0;
  77. Error += test_ulp_float_dist();
  78. Error += test_ulp_float_step();
  79. Error += test_ulp_double_dist();
  80. Error += test_ulp_double_step();
  81. return Error;
  82. }