1 /** Test of float functions with a single float argument
2 
3    func: SINF, SINHF, ASINF, COSF, COSHF, ACOSF, TANF, TANHF, ATANF, SQRTF, EXPF, LOGF, LOG10F, FLOORF, CEILF, FABSF, NEG
4 */
5 
6 #include <testfwk.h>
7 #include <math.h>
8 
9 #if 0
10 #   include <stdio.h>
11 #   define DEBUG(x) x      /* only for "make test-host" */
12 #   ifdef SDCC
13         void _putchar(char c);
14         void putchar(char c)
15         {
16             _putchar(c);
17         }
18 #   endif
19 #else
20 #   define DEBUG(x)
21 #endif
22 
23 #define {func} (1)
24 
25 #define TOLERANCE (1e-5)
26 
27 /* now exceptions for targets/functions which would not pass */
28 #if defined(__SDCC_pic16)
29 #   define FLOORF_DISABLED  (1)
30 #   define NEG_DISABLED  (1)
31 #   define ACOSF_DISABLED  (1)
32 #endif
33 
34 static float
dummy(float a)35 dummy (float a)
36 {
37   return a;
38 }
39 
40 static float
neg(float a)41 neg (float a)
42 {
43   return -a;
44 }
45 
46 typedef float (*float_test_func)(float) __reentrant;
47 
48 #if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory
49 
50 /* the table with functions, their argument, expected result, tolerance.
51    For most 8-bitters each testpoint uses 14 bytes so we could have a few:) */
52 struct
53 {
54     float_test_func f;
55     float arg, result, tolerance;
56 }
57 
58 static const testpoint[] =
59 {
60 
61     #if SINF
62     #   if {func}_DISABLED
63     #       warning {func} disabled
64     { dummy,      0.0,                    0.0,            TOLERANCE },
65     #   else
66     { sinf,       1.0,                    0.841470984,    TOLERANCE },
67     { sinf,      -2.0,                   -0.909297426,    TOLERANCE },
68     { sinf,       3.14159265/6.0,         0.5,            TOLERANCE },
69     { sinf,       3.14159265+2.0,        -0.909297426,    TOLERANCE },
70     #   endif
71     #endif
72     #if SINHF
73     #   if {func}_DISABLED
74     #       warning {func} disabled
75     { dummy,      0.0,                    0.0,            TOLERANCE },
76     #   else
77     { sinhf,      1.0,                    1.175201193,    TOLERANCE },
78     { sinhf,     -2.0,                   -3.626860407,    TOLERANCE },
79     { sinhf,      3.14159265/6.0,         0.547853473,    TOLERANCE },
80     { sinhf,      3.14159265+2.0,        85.49101383,     TOLERANCE },
81     #   endif
82     #endif
83     #if ASINF
84     #   if {func}_DISABLED
85     #       warning {func} disabled
86     { dummy,      0.0,                    0.0,            TOLERANCE },
87     #   else
88     { asinf,      0.5,                    3.14159265/6.0, TOLERANCE },
89     { asinf,      0.99749498,             1.5,            TOLERANCE },
90     { asinf,     -0.84147098,            -1.0,            TOLERANCE },
91     { asinf,      0.29552020,             0.3,            TOLERANCE },
92     #   endif
93     #endif
94 
95 
96     #if COSF
97     #   if {func}_DISABLED
98     #       warning {func} disabled
99     { dummy,      0.0,                    0.0,            TOLERANCE },
100     #   else
101     { cosf,       1.0,                    0.540302305,    TOLERANCE },
102     { cosf,       2.0,                   -0.416146836,    TOLERANCE },
103     { cosf,       3.14159265/3.0,         0.5,            TOLERANCE },
104     { cosf,       3.14159265+2.0,        +0.416146836,    TOLERANCE },
105     #    endif
106     #endif
107     #if COSHF
108     { coshf,      1.0,                    1.543080634,    TOLERANCE },
109     { coshf,      2.0,                    3.7621956910,   TOLERANCE },
110     { coshf,      3.0,                   10.06766199,     TOLERANCE },
111     { coshf,      4.0,                   27.30823283,     TOLERANCE },
112     #endif
113     #if ACOSF
114     #   if {func}_DISABLED
115     #       warning {func} disabled
116     { dummy,      0.0,                    0.0,            TOLERANCE },
117     #   else
118     { acosf,      0.1,                    1.470628905,    TOLERANCE },
119     { acosf,      0.5,                    1.047197551,    TOLERANCE },
120     { acosf,     -0.9,                    2.690565841,    TOLERANCE },
121     { acosf,      0.999,                  0.044725087,    TOLERANCE },
122     #   endif
123     #endif
124 
125 
126     #if TANF
127     #   if {func}_DISABLED
128     #       warning {func} disabled
129     { dummy,      0.0,                    0.0,            TOLERANCE },
130     #   else
131     { tanf,       1.0,                    1.557407724,    TOLERANCE },
132     { tanf,       2.0,                   -2.18503986,     TOLERANCE },
133     { tanf,       -1.5,                 -14.10141994,     TOLERANCE },
134     #   endif
135     #endif
136     #if TANHF
137     { tanhf,      1.0,                    0.761594155,    TOLERANCE },
138     { tanhf,      3.800201167,            0.999,          TOLERANCE },
139     { tanhf,      1.5,                    0.905148253,    TOLERANCE },
140     #endif
141     #if ATANF
142     #   if {func}_DISABLED
143     #       warning {func} disabled
144     { dummy,      0.0,                    0.0,            TOLERANCE },
145     #   else
146     { atanf,      1.0,                    0.7853981633,   TOLERANCE },
147     { atanf,      -2.0,                  -1.1071487177,   TOLERANCE },
148     { atanf,      42.0,                   1.5469913006,   TOLERANCE },
149     #   endif
150     #endif
151 
152 
153     #if SQRTF
154     { sqrtf,      5.0,                    2.23606801,     TOLERANCE },
155     { sqrtf,      1522756.0,           1234.0,            TOLERANCE },
156     { sqrtf,      10000.0,              100.0,            TOLERANCE },
157     #endif
158 
159 
160     #if EXPF
161     #   if {func}_DISABLED
162     #       warning {func} disabled
163     { dummy,      0.0,                    0.0,            TOLERANCE },
164     #   else
165     { expf,       2.30258509,            10.0,            TOLERANCE },
166     { expf,       4.82028150,           124.0,            TOLERANCE },
167     { expf,      10.0,                22026.46579,        TOLERANCE },
168     #   endif
169     #endif
170     #if LOGF
171     { logf,       2.06115362e-9,        -20.0,            TOLERANCE },
172     { logf,      10.0,                    2.30258509,     TOLERANCE },
173     { logf,     124.0,                    4.82028150,     TOLERANCE },
174     { logf,   22026.46579,               10.0,            TOLERANCE },
175     #endif
176     #if LOG10F
177     { log10f,     0.000001,              -6.0,            TOLERANCE },
178     { log10f,     3.16227766e-4,         -3.5,            TOLERANCE },
179     { log10f,     3.16227766,             0.5,            TOLERANCE },
180     { log10f,    10.0,                    1.0,            TOLERANCE },
181     { log10f,    1E6,                     6.0,            TOLERANCE },
182     #endif
183 
184 
185     #if FLOORF
186     #   if {func}_DISABLED
187     #       warning {func} disabled
188     { dummy,      0.0,                    0.0,            TOLERANCE },
189     #   else
190     { floorf,     1.0+0.000001,           1.0,            TOLERANCE },
191     { floorf,     1.0-0.000001,           0.0,            TOLERANCE },
192     { floorf,     1.0-0.000001,          -0.0,            TOLERANCE },
193     { floorf,    -1.0+0.000001,          -1.0,            TOLERANCE },
194     { floorf,    -1.0-0.000001,          -2.0,            TOLERANCE },
195     #   endif
196     #endif
197 
198 
199     #if CEILF
200     { ceilf,      1.0+0.000001,           2.0,            TOLERANCE },
201     { ceilf,      1.0-0.000001,           1.0,            TOLERANCE },
202     { ceilf,     -1.0+0.000001,           0.0,            TOLERANCE },
203     { ceilf,     -1.0-0.000001,          -1.0,            TOLERANCE },
204     #endif
205 
206 
207     #if FABSF
208     { fabsf,     -1.0e-20,                1.0e-20,        TOLERANCE },
209     { fabsf,      9999999,                9999999,        TOLERANCE },
210     #endif
211 
212 
213     #if NEG
214     #   if {func}_DISABLED
215     #       warning {func} disabled
216     { dummy,      0.0,                    0.0,            TOLERANCE },
217     #   else
218     { neg,        0.0,                   -0.0,            TOLERANCE },
219     { dummy,      0.0,                   -0.0,            TOLERANCE },
220     #   endif
221     #endif
222 
223 };
224 #endif
225 
226 void
testFloat(void)227 testFloat (void)
228 {
229 #if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15) // Lack of memory
230   unsigned char i;
231   float result, rel_error;
232 
233   for ( i = 0; i < sizeof testpoint / sizeof testpoint[0]; i++ )
234     {
235       result = testpoint[i].f (testpoint[i].arg);
236 
237       rel_error = testpoint[i].result ? result/testpoint[i].result - 1.0 : result;
238 
239       DEBUG (printf ("Test No: %d f(%f) = %f should: %f rel_error: %f %s\n",
240                      i, testpoint[i].arg, result, testpoint[i].result, rel_error,
241                      (fabsf (rel_error) < testpoint[i].tolerance) ? "Ok" : "Fail");)
242 
243       ASSERT (fabsf (rel_error) < testpoint[i].tolerance);
244     }
245 #endif
246 }
247