Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

trig.cpp 5.1 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://www.wtfpl.net/ for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <cmath>
  14. #include <lol/main.h>
  15. #include "lol/unit.h"
  16. namespace lol
  17. {
  18. LOLUNIT_FIXTURE(TrigTest)
  19. {
  20. LOLUNIT_TEST(AngleConversions)
  21. {
  22. LOLUNIT_ASSERT_DOUBLES_EQUAL(D_PI, radians(180.0), 1e-5);
  23. LOLUNIT_ASSERT_DOUBLES_EQUAL(D_PI_2, radians(90.0), 1e-5);
  24. LOLUNIT_ASSERT_DOUBLES_EQUAL(F_PI, radians(180.0f), 1e-5f);
  25. LOLUNIT_ASSERT_DOUBLES_EQUAL(F_PI_2, radians(90.0f), 1e-5f);
  26. LOLUNIT_ASSERT_DOUBLES_EQUAL(180.0, degrees(D_PI), 1e-5);
  27. LOLUNIT_ASSERT_DOUBLES_EQUAL(90.0, degrees(D_PI_2), 1e-5);
  28. LOLUNIT_ASSERT_DOUBLES_EQUAL(180.0f, degrees(F_PI), 1e-5f);
  29. LOLUNIT_ASSERT_DOUBLES_EQUAL(90.0f, degrees(F_PI_2), 1e-5f);
  30. }
  31. LOLUNIT_TEST(Sin)
  32. {
  33. using std::fabs;
  34. for (int i = -10000; i < 10000; i++)
  35. {
  36. double f = (double)i * (1.0 / 1000.0);
  37. #if defined __GNUC__ && !defined __SNC__
  38. double a = __builtin_sin(f);
  39. #else
  40. double a = std::sin(f);
  41. #endif
  42. double b = lol_sin(f);
  43. LOLUNIT_SET_CONTEXT(f);
  44. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
  45. }
  46. for (int i = -10000; i < 10000; i++)
  47. {
  48. double f = (double)i * (1.0 / 100000.0);
  49. #if defined __GNUC__ && !defined __SNC__
  50. double a = __builtin_sin(f);
  51. #else
  52. double a = std::sin(f);
  53. #endif
  54. double b = lol_sin(f);
  55. LOLUNIT_SET_CONTEXT(f);
  56. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
  57. }
  58. }
  59. LOLUNIT_TEST(Cos)
  60. {
  61. using std::fabs;
  62. for (int i = -10000; i < 10000; i++)
  63. {
  64. double f = (double)i * (1.0 / 1000.0);
  65. #if defined __GNUC__ && !defined __SNC__
  66. double a = __builtin_cos(f);
  67. #else
  68. double a = std::cos(f);
  69. #endif
  70. double b = lol_cos(f);
  71. LOLUNIT_SET_CONTEXT(f);
  72. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
  73. }
  74. for (int i = -10000; i < 10000; i++)
  75. {
  76. double f = (double)i * (1.0 / 100000.0);
  77. #if defined __GNUC__ && !defined __SNC__
  78. double a = __builtin_cos(f);
  79. #else
  80. double a = std::cos(f);
  81. #endif
  82. double b = lol_cos(f);
  83. LOLUNIT_SET_CONTEXT(f);
  84. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
  85. }
  86. }
  87. LOLUNIT_TEST(SinCos)
  88. {
  89. using std::fabs;
  90. for (int i = -10000; i < 10000; i++)
  91. {
  92. double f = (double)i * (1.0 / 1000.0);
  93. #if defined __GNUC__ && !defined __SNC__
  94. double a1 = __builtin_sin(f);
  95. double a2 = __builtin_cos(f);
  96. #else
  97. double a1 = std::sin(f);
  98. double a2 = std::cos(f);
  99. #endif
  100. double b1, b2;
  101. lol_sincos(f, &b1, &b2);
  102. LOLUNIT_SET_CONTEXT(f);
  103. LOLUNIT_ASSERT_DOUBLES_EQUAL(a1, b1, fabs(f) * 1e-11);
  104. LOLUNIT_ASSERT_DOUBLES_EQUAL(a2, b2, fabs(f) * 1e-11);
  105. }
  106. for (int i = -10000; i < 10000; i++)
  107. {
  108. double f = (double)i * (1.0 / 100000.0);
  109. #if defined __GNUC__ && !defined __SNC__
  110. double a1 = __builtin_sin(f);
  111. double a2 = __builtin_cos(f);
  112. #else
  113. double a1 = std::sin(f);
  114. double a2 = std::cos(f);
  115. #endif
  116. double b1, b2;
  117. lol_sincos(f, &b1, &b2);
  118. LOLUNIT_SET_CONTEXT(f);
  119. LOLUNIT_ASSERT_DOUBLES_EQUAL(a1, b1, fabs(f) * 1e-11);
  120. LOLUNIT_ASSERT_DOUBLES_EQUAL(a2, b2, fabs(f) * 1e-11);
  121. }
  122. }
  123. LOLUNIT_TEST(Tan)
  124. {
  125. using std::fabs;
  126. for (int i = -100000; i < 100000; i++)
  127. {
  128. double f = (double)i * (1.0 / 10000.0);
  129. #if defined __GNUC__ && !defined __SNC__
  130. double a = __builtin_tan(f);
  131. #else
  132. double a = std::tan(f);
  133. #endif
  134. double b = lol_tan(f);
  135. LOLUNIT_SET_CONTEXT(f);
  136. if (fabs(a) > 1e4)
  137. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * fabs(a) * 1e-11);
  138. else if (fabs(a) > 1.0)
  139. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * 1e-11);
  140. else
  141. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
  142. }
  143. for (int i = -10000; i < 10000; i++)
  144. {
  145. double f = (double)i * (1.0 / 100000.0);
  146. #if defined __GNUC__ && !defined __SNC__
  147. double a = __builtin_tan(f);
  148. #else
  149. double a = std::tan(f);
  150. #endif
  151. double b = lol_tan(f);
  152. LOLUNIT_SET_CONTEXT(f);
  153. if (fabs(a) > 1e4)
  154. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * fabs(a) * 1e-11);
  155. else if (fabs(a) > 1.0)
  156. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * 1e-11);
  157. else
  158. LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
  159. }
  160. }
  161. };
  162. } /* namespace lol */