| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
-
- #include "../testTools.h"
- #include "../../DFPSR/math/FixedPoint.h"
- #define MANTISSA(VALUE) FixedPoint(VALUE)
- #define WHOLE(VALUE) FixedPoint::fromWhole(VALUE)
- START_TEST(FixedPoint)
- // Comparison
- ASSERT_EQUAL(MANTISSA(-43), MANTISSA(-43));
- ASSERT_EQUAL(MANTISSA(0), MANTISSA(0));
- ASSERT_EQUAL(MANTISSA(2644), MANTISSA(2644));
- ASSERT_EQUAL(WHOLE(-360), WHOLE(-360));
- ASSERT_EQUAL(WHOLE(0), WHOLE(0));
- ASSERT_EQUAL(WHOLE(645), WHOLE(645));
- ASSERT_EQUAL(WHOLE(645), 645);
- ASSERT_EQUAL(645, WHOLE(645));
- // Addition
- ASSERT_EQUAL(WHOLE(1030) + WHOLE(204), 1234);
- ASSERT_EQUAL(WHOLE(1030) + 204, 1234);
- ASSERT_EQUAL(1030 + WHOLE(204), 1234);
- // Subtraction
- ASSERT_EQUAL(WHOLE(355) - WHOLE(55), 300);
- ASSERT_EQUAL(WHOLE(355) - 55, 300);
- ASSERT_EQUAL(355 - WHOLE(55), 300);
- // Multiplication
- ASSERT_EQUAL(WHOLE(25) * WHOLE(4), 100);
- ASSERT_EQUAL(WHOLE(25) * 4, 100);
- ASSERT_EQUAL(25 * WHOLE(4), 100);
- ASSERT_EQUAL(WHOLE(10) * WHOLE(2), 20);
- ASSERT_EQUAL(WHOLE(-10) * WHOLE(-2), 20);
- ASSERT_EQUAL(WHOLE(-10) * WHOLE(2), -20);
- ASSERT_EQUAL(WHOLE(10) * WHOLE(-2), -20);
- // Division
- ASSERT_EQUAL(WHOLE(35) / WHOLE(5), 7);
- ASSERT_EQUAL(WHOLE(35) / 5, 7);
- ASSERT_EQUAL(35 / WHOLE(5), 7);
- ASSERT_EQUAL(WHOLE(2000) / WHOLE(20), 100);
- ASSERT_EQUAL(WHOLE(-2000) / WHOLE(-20), 100);
- ASSERT_EQUAL(WHOLE(-2000) / WHOLE(20), -100);
- ASSERT_EQUAL(WHOLE(2000) / WHOLE(-20), -100);
- ASSERT_EQUAL(WHOLE(0) / WHOLE(0), 0);
- ASSERT_EQUAL(0 / WHOLE(0), 0);
- ASSERT_EQUAL(WHOLE(0) / 0, 0);
- ASSERT_EQUAL(WHOLE(1) / WHOLE(0), MANTISSA(2147483647));
- ASSERT_EQUAL(1 / WHOLE(0), MANTISSA(2147483647));
- ASSERT_EQUAL(WHOLE(1) / 0, MANTISSA(2147483647));
- ASSERT_EQUAL(WHOLE(-1) / WHOLE(0), MANTISSA(-2147483648));
- ASSERT_EQUAL(-1 / WHOLE(0), MANTISSA(-2147483648));
- ASSERT_EQUAL(WHOLE(-1) / 0, MANTISSA(-2147483648));
- // Parsing decimals from text should round to closest
- ASSERT_EQUAL(FixedPoint::fromText(U"1.000000000000000001"), WHOLE(1));
- ASSERT_EQUAL(FixedPoint::fromText(U"-1.000000000000000001"), WHOLE(-1));
- ASSERT_EQUAL(FixedPoint::fromText(U"0.000000000000000001"), WHOLE(0));
- ASSERT_EQUAL(FixedPoint::fromText(U"-0.000000000000000001"), WHOLE(0));
- ASSERT_EQUAL(FixedPoint::fromText(U"0.999999999999999999"), WHOLE(1));
- ASSERT_EQUAL(FixedPoint::fromText(U"-0.999999999999999999"), WHOLE(-1));
- // Half values should be bit-exact
- ASSERT_EQUAL(FixedPoint::fromText(U"0.5"), MANTISSA(32768));
- ASSERT_EQUAL(FixedPoint::fromText(U"-0.5"), MANTISSA(-32768));
- ASSERT_EQUAL(FixedPoint::fromText(U"0:32768"), MANTISSA(32768));
- ASSERT_EQUAL(FixedPoint::fromText(U"-0:32768"), MANTISSA(-32768));
- ASSERT_EQUAL(FixedPoint::fromText(U"1.5"), MANTISSA(98304));
- ASSERT_EQUAL(FixedPoint::fromText(U"-1.5"), MANTISSA(-98304));
- // Allow outside space and extra zeroes
- ASSERT_EQUAL(FixedPoint::fromText(U" 001:000"), WHOLE(1));
- ASSERT_EQUAL(FixedPoint::fromText(U"000503.000 "), WHOLE(503));
- // Whole values should remain whole
- int errorCount_whole = 0;
- for (int i = -32768; i < 32767; i++) {
- String textValue = string_combine(i);
- if (FixedPoint::fromText(textValue) != WHOLE(i)) { errorCount_whole++; }
- }
- ASSERT_EQUAL(errorCount_whole, 0);
- int errorCount_decimal = 0;
- for (int i = -32768; i < 32767; i++) {
- String textValue = string_combine(i, U".0");
- if (FixedPoint::fromText(textValue) != WHOLE(i)) { errorCount_decimal++; }
- }
- ASSERT_EQUAL(errorCount_decimal, 0);
- int errorCount_remainder = 0;
- for (int i = -32768; i < 32767; i++) {
- String textValue = string_combine(i, U":0");
- if (FixedPoint::fromText(textValue) != WHOLE(i)) { errorCount_remainder++; }
- }
- ASSERT_EQUAL(errorCount_remainder, 0);
- // Saturating should use the whole range including fractions
- ASSERT_EQUAL(FixedPoint::fromText(U"-453764573.34576012934264576354"), MANTISSA(-2147483648));
- ASSERT_EQUAL(FixedPoint::fromText(U"207284572931.60298753343645345"), MANTISSA(2147483647));
- // Rounding to whole integers
- ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"1528.34")), 1528);
- ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"-864.51")), -865);
- ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"0.49")), 0);
- ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"0.5")), 1);
- ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"0.51")), 1);
- ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"-0.49")), 0);
- ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"-0.5")), -1);
- ASSERT_EQUAL(fixedPoint_round(FixedPoint::fromText(U"-0.51")), -1);
- // Square roots
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(-1000)), WHOLE(0));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(-1)), WHOLE(0));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(0)), WHOLE(0));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(1)), WHOLE(1));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(4)), WHOLE(2));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(9)), WHOLE(3));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(16)), WHOLE(4));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(25)), WHOLE(5));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(36)), WHOLE(6));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(49)), WHOLE(7));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(64)), WHOLE(8));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(81)), WHOLE(9));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(100)), WHOLE(10));
- ASSERT_EQUAL(fixedPoint_squareRoot(WHOLE(10000)), WHOLE(100));
- END_TEST
|