OXYGENHUB
◆ main openmsx / src / unittest / FixedPoint_test.cc
2.1 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
e8555c89 Andy McCall 1
#include "catch.hpp"
2
#include "FixedPoint.hh"
3
4
#include "narrow.hh"
5
6
namespace openmsx {
7
8
template<unsigned BITS>
9
static void check(const FixedPoint<BITS>& fp, int expectedRaw)
10
{
11
	REQUIRE(fp.getRawValue() == expectedRaw);
12
	int       i = expectedRaw >> BITS;
13
	unsigned fi = expectedRaw & ((1 << BITS) - 1);
14
	float  ff = float (fi) / (1 << BITS);
15
	double fd = double(fi) / (1 << BITS);
16
	float  f = narrow_cast<float >(i) + ff;
17
	double d = narrow_cast<double>(i) + fd;
18
	CHECK(fp.toInt()            == i);
19
	CHECK(fp.toFloat()          == f);
20
	CHECK(fp.toDouble()         == d);
21
	CHECK(fp.fractAsInt()       == fi);
22
	CHECK(fp.fractionAsFloat()  == ff);
23
	CHECK(fp.fractionAsDouble() == fd);
24
	CHECK(fp.floor().getRawValue() == (i << BITS));
25
	CHECK(fp.fract().getRawValue() == int(fi));
26
}
27
28
TEST_CASE("FixedPoint")
29
{
30
	FixedPoint<2> a(10  ); check(a,  40);
31
	FixedPoint<2> b(3.5f); check(b,  14);
32
	FixedPoint<2> c(1.75); check(c,   7);
33
	FixedPoint<7> d(c);    check(d, 224); // more fractional bits
34
	FixedPoint<1> e(d);    check(e,   3); // less fractional bits
35
36
	check(FixedPoint<3>::roundRatioDown(2, 3), 5); // 2/3 ~= 5/8
37
38
	CHECK(a.divAsInt(b) == 2);
39
	CHECK(b.divAsInt(a) == 0);
40
	CHECK(b.divAsInt(c) == 2);
41
42
	check(a + b, 54);
43
	check(a + c, 47);
44
	check(b + c, 21);
45
46
	check(a - b, 26); check(b - a, -26);
47
	check(a - c, 33); check(c - a, -33);
48
	check(b - c,  7); check(c - b,  -7);
49
50
	check(a *  b, 140);
51
	check(a *  c,  70);
52
	check(b *  c,  24);
53
	check(a *  2,  80);
54
	check(b * -3, -42);
55
	check(c *  4,  28);
56
57
	check(a /  b, 11); check(b / a, 1);
58
	check(a /  c, 22); check(c / a, 0);
59
	check(b /  c,  8); check(c / b, 2);
60
	check(a / -5, -8);
61
	check(b /  4,  3);
62
	check(c / -3, -2);
63
64
	check(a << 1, 80); check(a >> 3, 5);
65
	check(b << 2, 56); check(b >> 2, 3);
66
	check(c << 3, 56); check(c >> 1, 3);
67
68
	CHECK(a == a); CHECK(!(a != a));
69
	CHECK(a != b); CHECK(!(a == b));
70
	CHECK(b <  a); CHECK(!(b >= a));
71
	CHECK(b <= a); CHECK(!(b >  a));
72
	CHECK(a >  b); CHECK(!(a <= b));
73
	CHECK(a >= b); CHECK(!(a <  b));
74
75
	a += b; check(a,  54);
76
	c -= a; check(c, -47);
77
78
	a.addQuantum(); check(a,  55);
79
	b.addQuantum(); check(b,  15);
80
	c.addQuantum(); check(c, -46);
81
}
82
83
} // namespace openmsx