FixedPoint_test.cc 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "catch.hpp"
  2. #include "FixedPoint.hh"
  3. using namespace openmsx;
  4. template<unsigned BITS>
  5. static void check(const FixedPoint<BITS>& fp, int expectedRaw)
  6. {
  7. REQUIRE(fp.getRawValue() == expectedRaw);
  8. int i = expectedRaw >> BITS;
  9. unsigned fi = expectedRaw & ((1 << BITS) - 1);
  10. float ff = float (fi) / (1 << BITS);
  11. double fd = double(fi) / (1 << BITS);
  12. float f = i + ff;
  13. double d = i + fd;
  14. CHECK(fp.toInt() == i);
  15. CHECK(fp.toFloat() == f);
  16. CHECK(fp.toDouble() == d);
  17. CHECK(fp.fractAsInt() == fi);
  18. CHECK(fp.fractionAsFloat() == ff);
  19. CHECK(fp.fractionAsDouble() == fd);
  20. CHECK(fp.floor().getRawValue() == (i << BITS));
  21. CHECK(fp.fract().getRawValue() == int(fi));
  22. }
  23. TEST_CASE("FixedPoint")
  24. {
  25. FixedPoint<2> a(10 ); check(a, 40);
  26. FixedPoint<2> b(3.5f); check(b, 14);
  27. FixedPoint<2> c(1.75); check(c, 7);
  28. FixedPoint<7> d(c); check(d, 224); // more fractional bits
  29. FixedPoint<1> e(d); check(e, 3); // less fractional bits
  30. check(FixedPoint<3>::roundRatioDown(2, 3), 5); // 2/3 ~= 5/8
  31. CHECK(a.divAsInt(b) == 2);
  32. CHECK(b.divAsInt(a) == 0);
  33. CHECK(b.divAsInt(c) == 2);
  34. check(a + b, 54);
  35. check(a + c, 47);
  36. check(b + c, 21);
  37. check(a - b, 26); check(b - a, -26);
  38. check(a - c, 33); check(c - a, -33);
  39. check(b - c, 7); check(c - b, -7);
  40. check(a * b, 140);
  41. check(a * c, 70);
  42. check(b * c, 24);
  43. check(a * 2, 80);
  44. check(b * -3, -42);
  45. check(c * 4, 28);
  46. check(a / b, 11); check(b / a, 1);
  47. check(a / c, 22); check(c / a, 0);
  48. check(b / c, 8); check(c / b, 2);
  49. check(a / -5, -8);
  50. check(b / 4, 3);
  51. check(c / -3, -2);
  52. check(a << 1, 80); check(a >> 3, 5);
  53. check(b << 2, 56); check(b >> 2, 3);
  54. check(c << 3, 56); check(c >> 1, 3);
  55. CHECK(a == a); CHECK(!(a != a));
  56. CHECK(a != b); CHECK(!(a == b));
  57. CHECK(b < a); CHECK(!(b >= a));
  58. CHECK(b <= a); CHECK(!(b > a));
  59. CHECK(a > b); CHECK(!(a <= b));
  60. CHECK(a >= b); CHECK(!(a < b));
  61. a += b; check(a, 54);
  62. c -= a; check(c, -47);
  63. a.addQuantum(); check(a, 55);
  64. b.addQuantum(); check(b, 15);
  65. c.addQuantum(); check(c, -46);
  66. }