summaryrefslogtreecommitdiff
path: root/support/regression/tests/float.c
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/regression/tests/float.c
downloadsdcc-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.c157
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
+