FixedPointTest.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. 
  2. #include "../testTools.h"
  3. #include "../../DFPSR/math/FixedPoint.h"
  4. #define MANTISSA(VALUE) FixedPoint(VALUE)
  5. #define WHOLE(VALUE) FixedPoint::fromWhole(VALUE)
  6. START_TEST(FixedPoint)
  7. // Comparison
  8. ASSERT_EQUAL(MANTISSA(-43), MANTISSA(-43));
  9. ASSERT_EQUAL(MANTISSA(0), MANTISSA(0));
  10. ASSERT_EQUAL(MANTISSA(2644), MANTISSA(2644));
  11. ASSERT_EQUAL(WHOLE(-360), WHOLE(-360));
  12. ASSERT_EQUAL(WHOLE(0), WHOLE(0));
  13. ASSERT_EQUAL(WHOLE(645), WHOLE(645));
  14. ASSERT_EQUAL(WHOLE(645), 645);
  15. ASSERT_EQUAL(645, WHOLE(645));
  16. // Addition
  17. ASSERT_EQUAL(WHOLE(1030) + WHOLE(204), 1234);
  18. ASSERT_EQUAL(WHOLE(1030) + 204, 1234);
  19. ASSERT_EQUAL(1030 + WHOLE(204), 1234);
  20. // Subtraction
  21. ASSERT_EQUAL(WHOLE(355) - WHOLE(55), 300);
  22. ASSERT_EQUAL(WHOLE(355) - 55, 300);
  23. ASSERT_EQUAL(355 - WHOLE(55), 300);
  24. // Multiplication
  25. ASSERT_EQUAL(WHOLE(25) * WHOLE(4), 100);
  26. ASSERT_EQUAL(WHOLE(25) * 4, 100);
  27. ASSERT_EQUAL(25 * WHOLE(4), 100);
  28. ASSERT_EQUAL(WHOLE(10) * WHOLE(2), 20);
  29. ASSERT_EQUAL(WHOLE(-10) * WHOLE(-2), 20);
  30. ASSERT_EQUAL(WHOLE(-10) * WHOLE(2), -20);
  31. ASSERT_EQUAL(WHOLE(10) * WHOLE(-2), -20);
  32. // Division
  33. ASSERT_EQUAL(WHOLE(35) / WHOLE(5), 7);
  34. ASSERT_EQUAL(WHOLE(35) / 5, 7);
  35. ASSERT_EQUAL(35 / WHOLE(5), 7);
  36. ASSERT_EQUAL(WHOLE(2000) / WHOLE(20), 100);
  37. ASSERT_EQUAL(WHOLE(-2000) / WHOLE(-20), 100);
  38. ASSERT_EQUAL(WHOLE(-2000) / WHOLE(20), -100);
  39. ASSERT_EQUAL(WHOLE(2000) / WHOLE(-20), -100);
  40. ASSERT_EQUAL(WHOLE(0) / WHOLE(0), 0);
  41. ASSERT_EQUAL(0 / WHOLE(0), 0);
  42. ASSERT_EQUAL(WHOLE(0) / 0, 0);
  43. ASSERT_EQUAL(WHOLE(1) / WHOLE(0), MANTISSA(2147483647));
  44. ASSERT_EQUAL(1 / WHOLE(0), MANTISSA(2147483647));
  45. ASSERT_EQUAL(WHOLE(1) / 0, MANTISSA(2147483647));
  46. ASSERT_EQUAL(WHOLE(-1) / WHOLE(0), MANTISSA(-2147483648));
  47. ASSERT_EQUAL(-1 / WHOLE(0), MANTISSA(-2147483648));
  48. ASSERT_EQUAL(WHOLE(-1) / 0, MANTISSA(-2147483648));
  49. // Parsing decimals from text should round to closest
  50. ASSERT_EQUAL(FixedPoint::fromText(U"1.000000000000000001"), WHOLE(1));
  51. ASSERT_EQUAL(FixedPoint::fromText(U"-1.000000000000000001"), WHOLE(-1));
  52. ASSERT_EQUAL(FixedPoint::fromText(U"0.000000000000000001"), WHOLE(0));
  53. ASSERT_EQUAL(FixedPoint::fromText(U"-0.000000000000000001"), WHOLE(0));
  54. ASSERT_EQUAL(FixedPoint::fromText(U"0.999999999999999999"), WHOLE(1));
  55. ASSERT_EQUAL(FixedPoint::fromText(U"-0.999999999999999999"), WHOLE(-1));
  56. // Half values should be bit-exact
  57. ASSERT_EQUAL(FixedPoint::fromText(U"0.5"), MANTISSA(32768));
  58. ASSERT_EQUAL(FixedPoint::fromText(U"-0.5"), MANTISSA(-32768));
  59. ASSERT_EQUAL(FixedPoint::fromText(U"0:32768"), MANTISSA(32768));
  60. ASSERT_EQUAL(FixedPoint::fromText(U"-0:32768"), MANTISSA(-32768));
  61. ASSERT_EQUAL(FixedPoint::fromText(U"1.5"), MANTISSA(98304));
  62. ASSERT_EQUAL(FixedPoint::fromText(U"-1.5"), MANTISSA(-98304));
  63. // Allow outside space and extra zeroes
  64. ASSERT_EQUAL(FixedPoint::fromText(U" 001:000"), WHOLE(1));
  65. ASSERT_EQUAL(FixedPoint::fromText(U"000503.000 "), WHOLE(503));
  66. // Whole values should remain whole
  67. int errorCount_whole = 0;
  68. for (int i = -32768; i < 32767; i++) {
  69. String textValue = string_combine(i);
  70. if (FixedPoint::fromText(textValue) != WHOLE(i)) { errorCount_whole++; }
  71. }
  72. ASSERT_EQUAL(errorCount_whole, 0);
  73. int errorCount_decimal = 0;
  74. for (int i = -32768; i < 32767; i++) {
  75. String textValue = string_combine(i, U".0");
  76. if (FixedPoint::fromText(textValue) != WHOLE(i)) { errorCount_decimal++; }
  77. }
  78. ASSERT_EQUAL(errorCount_decimal, 0);
  79. int errorCount_remainder = 0;
  80. for (int i = -32768; i < 32767; i++) {
  81. String textValue = string_combine(i, U":0");
  82. if (FixedPoint::fromText(textValue) != WHOLE(i)) { errorCount_remainder++; }
  83. }
  84. ASSERT_EQUAL(errorCount_remainder, 0);
  85. // Saturating should use the whole range including fractions
  86. ASSERT_EQUAL(FixedPoint::fromText(U"-453764573.34576012934264576354"), MANTISSA(-2147483648));
  87. ASSERT_EQUAL(FixedPoint::fromText(U"207284572931.60298753343645345"), MANTISSA(2147483647));
  88. // Rounding to whole integers
  89. ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"1528.34")), 1528);
  90. ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"-864.51")), -865);
  91. ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"0.49")), 0);
  92. ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"0.5")), 1);
  93. ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"0.51")), 1);
  94. ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"-0.49")), 0);
  95. ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"-0.5")), -1);
  96. ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"-0.51")), -1);
  97. // Square roots
  98. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(-1000)), WHOLE(0));
  99. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(-1)), WHOLE(0));
  100. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(0)), WHOLE(0));
  101. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(1)), WHOLE(1));
  102. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(4)), WHOLE(2));
  103. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(9)), WHOLE(3));
  104. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(16)), WHOLE(4));
  105. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(25)), WHOLE(5));
  106. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(36)), WHOLE(6));
  107. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(49)), WHOLE(7));
  108. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(64)), WHOLE(8));
  109. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(81)), WHOLE(9));
  110. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(100)), WHOLE(10));
  111. ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(10000)), WHOLE(100));
  112. END_TEST