numerictoolsTest.cpp 4.7 KB

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