prevent a timeout of the simulator
[fw/sdcc] / support / regression / tests / float.c
1 #if 1
2   // we are in the regression tests
3   #include <testfwk.h>
4   #define DEBUG(x)
5 #else
6   // we are standalone
7   #include <stdio.h>
8   #define DEBUG(x) x
9   #define ASSERT(x)
10 #endif
11
12 volatile float left, right, result;
13
14 struct {
15   float left, right, add, sub, mul, div, revdiv;
16 } cases[]={
17   //     left  right        add        sub          mul         div   revdiv
18   {      12.8,  25.6,      38.4,     -12.8,      327.68,        0.5,  2},
19   {      12.8, -25.6,     -12.8,      38.4,     -327.68,       -0.5, -2},
20   {     -12.8,  25.6,      12.8,     -38.4,     -327.68,       -0.5, -2},
21   {     -12.8, -25.6,     -38.4,      12.8,      327.68,        0.5,  2},
22   {     100.0,  10.0,     110.0,      90.0,     1000.00,       10.0,  0.1},
23 //{    1000.0,  10.0,    1010.0,     990.0,    10000.00,      100.0,  0.01},
24   {   10000.0,  10.0,   10010.0,    9990.0,   100000.00,     1000.0,  0.001},
25 //{  100000.0,  10.0,  100010.0,   99990.0,  1000000.00,    10000.0,  0.0001},
26   { 1000000.0,  10.0, 1000010.0,  999990.0, 10000000.00,   100000.0,  0.00001},
27   {10000000.0,  10.0,10000010.0, 9999990.0,100000000.00,  1000000.0,  0.000001},
28   {     0x100,  0x10,     0x110,      0xf0,      0x1000,       0x10,  0.0625},
29 //{    0x1000,  0x10,    0x1010,     0xff0,     0x10000,      0x100,  0.00390625},
30   {   0x10000,  0x10,   0x10010,    0xfff0,    0x100000,     0x1000,  0.00024414},
31 //{  0x100000,  0x10,  0x100010,   0xffff0,   0x1000000,    0x10000,  0 /* ignore */},
32   { 0x1000000,  0x10, 0x1000010,  0xfffff0,  0x10000000,   0x100000,  0 /* ignore */},
33   {0x10000000,  0x10,0x10000010, 0xffffff0, 0x100000000,  0x1000000,  0 /* ignore */},
34 };
35
36 int tests=0, errors=0;
37
38 char compare (float is, float should) {
39   float diff = should ? is/should : 0;
40   tests++;
41   DEBUG(printf (" %1.3f (%f %f) ", is, should, diff));
42
43   if (should==0) {
44     DEBUG(printf ("IGNORED!\n"));
45     return 0;
46   }
47
48   // skip the fp roundoff errors
49   if (diff>0.999999 && diff<1.00001) {
50     DEBUG(printf ("OK!\n"));
51     ASSERT(1);
52     return 0;
53   } else {
54     errors++;
55     DEBUG(printf ("FAIL!\n"));
56     ASSERT(0);
57     return 1;
58   }
59 }
60
61 void
62 testFloatMath(void)
63 {
64   int i;
65   int t = sizeof(cases)/sizeof(cases[0]);
66   float result;
67
68   for (i=0; i<t; i++) {
69     // add
70     result=cases[i].left+cases[i].right;
71     DEBUG(printf ("%1.3f + %1.3f =", cases[i].left, cases[i].right));
72     compare(result, cases[i].add);
73     // sub
74     result=cases[i].left-cases[i].right;
75     DEBUG(printf ("%1.3f - %1.3f =", cases[i].left, cases[i].right));
76     compare(result, cases[i].sub);
77     // mul
78     result=cases[i].left*cases[i].right;
79     DEBUG(printf ("%1.3f * %1.3f =", cases[i].left, cases[i].right));
80     compare(result, cases[i].mul);
81     // div
82     result=cases[i].left/cases[i].right;
83     DEBUG(printf ("%1.3f / %1.3f =", cases[i].left, cases[i].right));
84     compare(result, cases[i].div);
85     // revdiv
86     result=cases[i].right/cases[i].left;
87     DEBUG(printf ("%1.3f / %1.3f =", cases[i].right, cases[i].left));
88     compare(result, cases[i].revdiv);
89   }
90   DEBUG(printf ("%d tests, %d errors\n", tests, errors));
91 }
92
93 #ifndef REENTRANT
94 void main(void) {
95   testFloatMath();
96 }
97 #endif