diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/regression/tests/float.c | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'support/regression/tests/float.c')
| -rw-r--r-- | support/regression/tests/float.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/support/regression/tests/float.c b/support/regression/tests/float.c new file mode 100644 index 0000000..6a7cb68 --- /dev/null +++ b/support/regression/tests/float.c @@ -0,0 +1,157 @@ +/* Float tests. + + operation: ADD, SUB, MUL, DIV, REVDIV +*/ + +#if 1 + // we are in the regression tests + #include <testfwk.h> + #define DEBUG(x) + + #define {operation} 1 +#else + // we are standalone + #include <stdio.h> + #define DEBUG(x) x + #define ASSERT(x) + #define ADD 1 + #define SUB 1 + #define MUL 1 + #define DIV 1 + #define REVDIV 1 +#endif + +#ifdef __SDCC_mcs51 +# define STORAGE __xdata +# define XDATA __xdata +#elif __SDCC_pic16 +# define STORAGE __code +# define XDATA +#else +# define STORAGE +# define XDATA +#endif + +#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory +XDATA volatile float left, right, result; + +struct { + float left, right, add, sub, mul, div, revdiv; +} STORAGE cases[]={ + // left right add sub mul div revdiv + { 12.8, 25.6, 38.4, -12.8, 327.68, 0.5, 2}, + { 12.8, -25.6, -12.8, 38.4, -327.68, -0.5, -2}, + { -12.8, 25.6, 12.8, -38.4, -327.68, -0.5, -2}, + { -12.8, -25.6, -38.4, 12.8, 327.68, 0.5, 2}, + { 100.0, 10.0, 110.0, 90.0, 1000.00, 10.0, 0.1}, + { 1000.0, 10.0, 1010.0, 990.0, 10000.00, 100.0, 0.01}, + { 10000.0, 10.0, 10010.0, 9990.0, 100000.00, 1000.0, 0.001}, + { 100000.0, 10.0, 100010.0, 99990.0, 1000000.00, 10000.0, 0.0001}, + { 1000000.0, 10.0, 1000010.0, 999990.0, 10000000.00, 100000.0, 0.00001}, + {10000000.0, 10.0,10000010.0, 9999990.0,100000000.00, 1000000.0, 0.000001}, + { 0x100, 0x10, 0x110, 0xf0, 0x1000, 0x10, 0.0625}, + { 0x1000, 0x10, 0x1010, 0xff0, 0x10000, 0x100, 0.00390625}, + { 0x10000, 0x10, 0x10010, 0xfff0, 0x100000, 0x1000, 0.00024414}, + { 0x100000, 0x10, 0x100010, 0xffff0, 0x1000000, 0x10000, 0 /* ignore */}, + { 0x1000000, 0x10, 0x1000010, 0xfffff0, 0x10000000, 0x100000, 0 /* ignore */}, + {0x10000000, 0x10,0x10000010, 0xffffff0, (float)0x10000000*0x10, + 0x1000000, 0 /* ignore */}, +}; + +XDATA int tests = 0, errors = 0; + +char +compare (float is, float should) +{ + float diff = should ? is / should : 0; + tests++; + DEBUG (printf (" %1.3f (%f %f) ", is, should, diff)); + + if (should == 0) + { + DEBUG (printf ("IGNORED!\n")); + return 0; + } + + // skip the fp roundoff errors + if (diff > 0.999999 && diff < 1.00001) + { + DEBUG (printf ("OK!\n")); + ASSERT (1); + return 0; + } + else + { + errors++; + DEBUG (printf ("FAIL!\n")); + ASSERT (0); + return 1; + } +} +#endif + +void +testFloatMath (void) +{ +#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory + int i; + int t = sizeof (cases) / sizeof (cases[0]); + float result; + + for (i = 0; i < t; i++) + { + DEBUG (printf ("Case %d ", i)); + #ifdef ADD + // add + result = cases[i].left + cases[i].right; + DEBUG (printf ("%1.3f + %1.3f =", cases[i].left, cases[i].right)); + compare (result, cases[i].add); + #endif + #ifdef SUB + // sub + result = cases[i].left - cases[i].right; + DEBUG (printf ("%1.3f - %1.3f =", cases[i].left, cases[i].right)); + compare (result, cases[i].sub); + #endif + #ifdef MUL + // mul + result = cases[i].left * cases[i].right; + DEBUG (printf ("%1.3f * %1.3f =", cases[i].left, cases[i].right)); + compare (result, cases[i].mul); + #endif + #ifdef DIV + // div + result = cases[i].left / cases[i].right; + DEBUG (printf ("%1.3f / %1.3f =", cases[i].left, cases[i].right)); + compare (result, cases[i].div); + #endif + #ifdef REVDIV + // revdiv + result = cases[i].right / cases[i].left; + DEBUG (printf ("%1.3f / %1.3f =", cases[i].right, cases[i].left)); + compare(result, cases[i].revdiv); + #endif + } + DEBUG (printf ("%d tests, %d errors\n", tests, errors)); +#endif +} + +void +testFloatMulRound (void) +{ +#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory + right = 2.0 / 10.61; + result = 10.61 * right; + compare (result, 2.0); +#endif +} + +#if 0 +void +main (void) +{ + testFloatMath (); + testFloatMulRound (); +} +#endif + |
