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