+/* 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
-volatile float left, right, result;
+XDATA volatile float left, right, result;
struct {
float left, right, add, sub, mul, div, revdiv;
-} cases[]={
+} 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},
{ 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, 0x100000000, 0x1000000, 0 /* ignore */},
+ {0x10000000, 0x10,0x10000010, 0xffffff0, (float)0x10000000*0x10,
+ 0x1000000, 0 /* ignore */},
};
-int tests=0, errors=0;
+XDATA int tests=0, errors=0;
char compare (float is, float should) {
float diff = should ? is/should : 0;
}
}
-void testFloatMath(void) {
+void
+testFloatMath(void)
+{
int i;
int t = sizeof(cases)/sizeof(cases[0]);
float result;
for (i=0; i<t; i++) {
- // 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);
- // 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);
- // 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);
- // 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);
- // 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);
+ #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));
}