Imported Upstream version 2.9.0
[debian/cc1111] / support / regression / tests / float.c
1 /* Float tests.
2
3    operation: ADD, SUB, MUL, DIV, REVDIV
4 */
5
6 #if 1
7   // we are in the regression tests
8   #include <testfwk.h>
9   #define DEBUG(x)
10
11   #define {operation} 1
12 #else
13   // we are standalone
14   #include <stdio.h>
15   #define DEBUG(x) x
16   #define ASSERT(x)
17   #define ADD 1
18   #define SUB 1
19   #define MUL 1
20   #define DIV 1
21   #define REVDIV 1
22 #endif
23
24 #ifdef SDCC_mcs51
25 #  define STORAGE xdata
26 #  define XDATA xdata
27 #elif SDCC_pic16
28 #  define STORAGE code
29 #  define XDATA
30 #else
31 #  define STORAGE
32 #  define XDATA
33 #endif
34
35 XDATA volatile float left, right, result;
36
37 struct {
38   float left, right, add, sub, mul, div, revdiv;
39 } STORAGE cases[]={
40   //     left  right        add        sub          mul         div   revdiv
41   {      12.8,  25.6,      38.4,     -12.8,      327.68,        0.5,  2},
42   {      12.8, -25.6,     -12.8,      38.4,     -327.68,       -0.5, -2},
43   {     -12.8,  25.6,      12.8,     -38.4,     -327.68,       -0.5, -2},
44   {     -12.8, -25.6,     -38.4,      12.8,      327.68,        0.5,  2},
45   {     100.0,  10.0,     110.0,      90.0,     1000.00,       10.0,  0.1},
46   {    1000.0,  10.0,    1010.0,     990.0,    10000.00,      100.0,  0.01},
47   {   10000.0,  10.0,   10010.0,    9990.0,   100000.00,     1000.0,  0.001},
48   {  100000.0,  10.0,  100010.0,   99990.0,  1000000.00,    10000.0,  0.0001},
49   { 1000000.0,  10.0, 1000010.0,  999990.0, 10000000.00,   100000.0,  0.00001},
50   {10000000.0,  10.0,10000010.0, 9999990.0,100000000.00,  1000000.0,  0.000001},
51   {     0x100,  0x10,     0x110,      0xf0,      0x1000,       0x10,  0.0625},
52   {    0x1000,  0x10,    0x1010,     0xff0,     0x10000,      0x100,  0.00390625},
53   {   0x10000,  0x10,   0x10010,    0xfff0,    0x100000,     0x1000,  0.00024414},
54   {  0x100000,  0x10,  0x100010,   0xffff0,   0x1000000,    0x10000,  0 /* ignore */},
55   { 0x1000000,  0x10, 0x1000010,  0xfffff0,  0x10000000,   0x100000,  0 /* ignore */},
56   {0x10000000,  0x10,0x10000010, 0xffffff0, (float)0x10000000*0x10,
57                                                           0x1000000,  0 /* ignore */},
58 };
59
60 XDATA int tests=0, errors=0;
61
62 char compare (float is, float should) {
63   float diff = should ? is/should : 0;
64   tests++;
65   DEBUG(printf (" %1.3f (%f %f) ", is, should, diff));
66
67   if (should==0) {
68     DEBUG(printf ("IGNORED!\n"));
69     return 0;
70   }
71
72   // skip the fp roundoff errors
73   if (diff>0.999999 && diff<1.00001) {
74     DEBUG(printf ("OK!\n"));
75     ASSERT(1);
76     return 0;
77   } else {
78     errors++;
79     DEBUG(printf ("FAIL!\n"));
80     ASSERT(0);
81     return 1;
82   }
83 }
84
85 void
86 testFloatMath(void)
87 {
88   int i;
89   int t = sizeof(cases)/sizeof(cases[0]);
90   float result;
91
92   for (i=0; i<t; i++) {
93     #ifdef ADD
94       // add
95       result=cases[i].left+cases[i].right;
96       DEBUG(printf ("%1.3f + %1.3f =", cases[i].left, cases[i].right));
97       compare(result, cases[i].add);
98     #endif
99     #ifdef SUB
100       // sub
101       result=cases[i].left-cases[i].right;
102       DEBUG(printf ("%1.3f - %1.3f =", cases[i].left, cases[i].right));
103       compare(result, cases[i].sub);
104     #endif
105     #ifdef MUL
106       // mul
107       result=cases[i].left*cases[i].right;
108       DEBUG(printf ("%1.3f * %1.3f =", cases[i].left, cases[i].right));
109       compare(result, cases[i].mul);
110     #endif
111     #ifdef DIV
112       // div
113       result=cases[i].left/cases[i].right;
114       DEBUG(printf ("%1.3f / %1.3f =", cases[i].left, cases[i].right));
115       compare(result, cases[i].div);
116     #endif
117     #ifdef REVDIV
118       // revdiv
119       result=cases[i].right/cases[i].left;
120       DEBUG(printf ("%1.3f / %1.3f =", cases[i].right, cases[i].left));
121       compare(result, cases[i].revdiv);
122     #endif
123   }
124   DEBUG(printf ("%d tests, %d errors\n", tests, errors));
125 }
126
127 #ifndef REENTRANT
128 void main(void) {
129   testFloatMath();
130 }
131 #endif