numerictoolsTest.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "numerictoolsTest.h"
  2. #include <core/basics/cppunitex.h>
  3. #include <core/basics/numerictools.h>
  4. #include <core/basics/tools.h>
  5. //#include <core/basics/stringutils.h>
  6. #include <core/basics/Exception.h>
  7. #include <core/basics/Streamable.h>
  8. #include <core/basics/BinStreamable.h>
  9. #include <core/basics/Timer.h>
  10. #include <core/basics/FrameRateCounter.h>
  11. #include <core/basics/FileName.h>
  12. #include <core/basics/NonCopyable.h>
  13. #include <core/basics/Log.h>
  14. #include <core/basics/Observable.h>
  15. #include <core/basics/Observer.h>
  16. //#include <core/basics/vectorio.h>
  17. //#include <core/basics/assert.h>
  18. #include <assert.h>
  19. // #include <core/basics/ransac.h>
  20. #include <core/basics/deprecated.h>
  21. #include <core/basics/types.h>
  22. using namespace std;
  23. using namespace NICE;
  24. CPPUNIT_TEST_SUITE_REGISTRATION( NumericToolsTest );
  25. void NumericToolsTest::setUp() {
  26. }
  27. void NumericToolsTest::tearDown() {
  28. }
  29. void NumericToolsTest::testSign() {
  30. CPPUNIT_ASSERT_EQUAL(1, sign(10));
  31. CPPUNIT_ASSERT_EQUAL(-1, sign(-10));
  32. CPPUNIT_ASSERT_EQUAL(0, sign(0));
  33. CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0f, sign(5.0f), 1E-6);
  34. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-1.0f, sign(-5.0f), 1E-6);
  35. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0f, sign(0.0f), 1E-6);
  36. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(1.0, sign(5.0), 1E-20);
  37. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-1.0, sign(-5.0), 1E-20);
  38. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0, sign(0.0), 1E-20);
  39. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0, sign(1E-17), 1E-20);
  40. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(0.0, sign(-1E-40), 1E-20);
  41. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(
  42. 1.0, sign(std::numeric_limits<double>::epsilon()), 1E-20);
  43. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(
  44. 0.0, sign(std::numeric_limits<double>::epsilon() / 2.0), 1E-20);
  45. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(
  46. 1.0f, sign(std::numeric_limits<float>::epsilon()), 1E-20);
  47. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(
  48. 0.0f, sign(std::numeric_limits<float>::epsilon() / 2.0f), 1E-20);
  49. }
  50. void NumericToolsTest::testIsZeroAndEqual() {
  51. CPPUNIT_ASSERT(isZero(1E-10f));
  52. CPPUNIT_ASSERT(!isZero(1E-10));
  53. CPPUNIT_ASSERT(isZero(1E-50));
  54. CPPUNIT_ASSERT(isZero(1E-10f, 1E-9f));
  55. CPPUNIT_ASSERT(!isZero(1E-10, 1E-10));
  56. CPPUNIT_ASSERT(isZero(1E-10, 1E-9));
  57. CPPUNIT_ASSERT(isZero(1E-50, 1E-49));
  58. CPPUNIT_ASSERT(isEqual(1E-10f, 2E-10f, 1E-9f));
  59. CPPUNIT_ASSERT(isEqual(1E-10, 2E-10, 1E-9));
  60. CPPUNIT_ASSERT(!isEqual(1E-10, 2E-10, 1E-10));
  61. }
  62. void NumericToolsTest::testImposeSign() {
  63. CPPUNIT_ASSERT_EQUAL(-25, imposeSign(25, -17));
  64. CPPUNIT_ASSERT_EQUAL(0, imposeSign(25, 0));
  65. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-25.0f, imposeSign(-25.0f, -17.0f), 1E-6);
  66. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-25.0, imposeSign(-25.0, -17.0), 1E-20);
  67. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-25.0f, imposeSign(25.0f, -17.0f), 1E-6);
  68. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-25.0, imposeSign(25.0, -17.0), 1E-20);
  69. }
  70. void NumericToolsTest::testAbsolute() {
  71. CPPUNIT_ASSERT_EQUAL(25, absolute((int)-25));
  72. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(25.0f, absolute(-25.0f), 1E-6);
  73. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(25.0, absolute(-25.0), 1E-20);
  74. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(1E-10, absolute(-1E-10), 1E-20);
  75. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(1E-10, absolute(1E-10), 1E-20);
  76. }
  77. void NumericToolsTest::testSquare() {
  78. CPPUNIT_ASSERT_EQUAL(25, square(5));
  79. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(25.0f, square(5.0f), 1E-6);
  80. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(25.0, square(5.0), 1E-20);
  81. }
  82. void NumericToolsTest::testCubeRoot() {
  83. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(2.0, cubeRoot(8.0), 1E-20);
  84. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-2.0, cubeRoot(-8.0), 1E-20);
  85. }
  86. void NumericToolsTest::testIsNaN() {
  87. double zero = 1.0;
  88. zero -= zero;
  89. CPPUNIT_ASSERT(isNaN(0.0 / zero));
  90. CPPUNIT_ASSERT(isNaN(0.0f / (float)zero));
  91. CPPUNIT_ASSERT(isNaN(doubleNaN()));
  92. CPPUNIT_ASSERT(isNaN(floatNaN()));
  93. }
  94. void NumericToolsTest::testLimitValue() {
  95. CPPUNIT_ASSERT_EQUAL(11, limitValue(11, 10, 30));
  96. CPPUNIT_ASSERT_EQUAL(29, limitValue(29, 10, 30));
  97. CPPUNIT_ASSERT_EQUAL(10, limitValue(10, 10, 30));
  98. CPPUNIT_ASSERT_EQUAL(10, limitValue(9, 10, 30));
  99. CPPUNIT_ASSERT_EQUAL(30, limitValue(30, 10, 30));
  100. CPPUNIT_ASSERT_EQUAL(30, limitValue(31, 10, 30));
  101. }
  102. void NumericToolsTest::testStringToDouble() {
  103. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-15E3, stringToDouble("-15E3"), 1E-20);
  104. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(-15E3, stringToDouble(" -15E3 "), 1E-20);
  105. CPPUNIT_ASSERT_THROW(stringToDouble("-15E3 x"), Exception);
  106. CPPUNIT_ASSERT_THROW(stringToDouble("-15E"), Exception);
  107. }
  108. void NumericToolsTest::testStringToInt() {
  109. CPPUNIT_ASSERT_EQUAL(-15, (int)stringToInt("-15"));
  110. CPPUNIT_ASSERT_EQUAL(-15, (int)stringToInt(" -15 "));
  111. CPPUNIT_ASSERT_THROW(stringToInt("-15 x"), Exception);
  112. CPPUNIT_ASSERT_THROW(stringToInt("-15E"), Exception);
  113. }