OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkCordic.h" | 8 #include "SkCordic.h" |
9 #include "SkMathPriv.h" | 9 #include "SkMathPriv.h" |
10 #include "Sk64.h" | 10 #include "Sk64.h" |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 #ifdef SK_DEBUG | 196 #ifdef SK_DEBUG |
197 | 197 |
198 #include "SkFloatingPoint.h" | 198 #include "SkFloatingPoint.h" |
199 | 199 |
200 void SkCordic_UnitTest() | 200 void SkCordic_UnitTest() |
201 { | 201 { |
202 #if defined(SK_SUPPORT_UNITTEST) | 202 #if defined(SK_SUPPORT_UNITTEST) |
203 float val; | 203 float val; |
204 for (float angle = -720; angle < 720; angle += 30) { | 204 for (float angle = -720; angle < 720; angle += 30) { |
205 float radian = angle * 3.1415925358f / 180.0f; | 205 float radian = angle * 3.1415925358f / 180.0f; |
206 SkFixed f_angle = (int) (radian * 65536.0f); | 206 SkFixed f_angle = SkFloatToFixed(radian); |
207 // sincos | 207 // sincos |
208 float sine = sinf(radian); | 208 float sine = sinf(radian); |
209 float cosine = cosf(radian); | 209 float cosine = cosf(radian); |
210 SkFixed f_cosine; | 210 SkFixed f_cosine; |
211 SkFixed f_sine = SkCordicSinCos(f_angle, &f_cosine); | 211 SkFixed f_sine = SkCordicSinCos(f_angle, &f_cosine); |
212 float sine2 = (float) f_sine / 65536.0f; | 212 float sine2 = (float) f_sine / 65536.0f; |
213 float cosine2 = (float) f_cosine / 65536.0f; | 213 float cosine2 = (float) f_cosine / 65536.0f; |
214 float error = fabsf(sine - sine2); | 214 float error = fabsf(sine - sine2); |
215 if (error > 0.001) | 215 if (error > 0.001) |
216 SkDebugf("sin error : angle = %g ; sin = %g ; cordic = %g\n", angle,
sine, sine2); | 216 SkDebugf("sin error : angle = %g ; sin = %g ; cordic = %g\n", angle,
sine, sine2); |
217 error = fabsf(cosine - cosine2); | 217 error = fabsf(cosine - cosine2); |
218 if (error > 0.001) | 218 if (error > 0.001) |
219 SkDebugf("cos error : angle = %g ; cos = %g ; cordic = %g\n", angle,
cosine, cosine2); | 219 SkDebugf("cos error : angle = %g ; cos = %g ; cordic = %g\n", angle,
cosine, cosine2); |
220 // tan | 220 // tan |
221 float _tan = tanf(radian); | 221 float _tan = tanf(radian); |
222 SkFixed f_tan = SkCordicTan(f_angle); | 222 SkFixed f_tan = SkCordicTan(f_angle); |
223 float tan2 = (float) f_tan / 65536.0f; | 223 float tan2 = (float) f_tan / 65536.0f; |
224 error = fabsf(_tan - tan2); | 224 error = fabsf(_tan - tan2); |
225 if (error > 0.05 && fabsf(_tan) < 1e6) | 225 if (error > 0.05 && fabsf(_tan) < 1e6) |
226 SkDebugf("tan error : angle = %g ; tan = %g ; cordic = %g\n", angle,
_tan, tan2); | 226 SkDebugf("tan error : angle = %g ; tan = %g ; cordic = %g\n", angle,
_tan, tan2); |
227 } | 227 } |
228 for (val = -1; val <= 1; val += .1f) { | 228 for (val = -1; val <= 1; val += .1f) { |
229 SkFixed f_val = (int) (val * 65536.0f); | 229 SkFixed f_val = SkFloatToFixed(val); |
230 // asin | 230 // asin |
231 float arcsine = asinf(val); | 231 float arcsine = asinf(val); |
232 SkFixed f_arcsine = SkCordicASin(f_val); | 232 SkFixed f_arcsine = SkCordicASin(f_val); |
233 float arcsine2 = (float) f_arcsine / 65536.0f; | 233 float arcsine2 = (float) f_arcsine / 65536.0f; |
234 float error = fabsf(arcsine - arcsine2); | 234 float error = fabsf(arcsine - arcsine2); |
235 if (error > 0.001) | 235 if (error > 0.001) |
236 SkDebugf("asin error : val = %g ; asin = %g ; cordic = %g\n", val, a
rcsine, arcsine2); | 236 SkDebugf("asin error : val = %g ; asin = %g ; cordic = %g\n", val, a
rcsine, arcsine2); |
237 } | 237 } |
238 #if 1 | 238 #if 1 |
239 for (val = -1; val <= 1; val += .1f) { | 239 for (val = -1; val <= 1; val += .1f) { |
240 #else | 240 #else |
241 val = .5; { | 241 val = .5; { |
242 #endif | 242 #endif |
243 SkFixed f_val = (int) (val * 65536.0f); | 243 SkFixed f_val = SkFloatToFixed(val); |
244 // acos | 244 // acos |
245 float arccos = acosf(val); | 245 float arccos = acosf(val); |
246 SkFixed f_arccos = SkCordicACos(f_val); | 246 SkFixed f_arccos = SkCordicACos(f_val); |
247 float arccos2 = (float) f_arccos / 65536.0f; | 247 float arccos2 = (float) f_arccos / 65536.0f; |
248 float error = fabsf(arccos - arccos2); | 248 float error = fabsf(arccos - arccos2); |
249 if (error > 0.001) | 249 if (error > 0.001) |
250 SkDebugf("acos error : val = %g ; acos = %g ; cordic = %g\n", val, a
rccos, arccos2); | 250 SkDebugf("acos error : val = %g ; acos = %g ; cordic = %g\n", val, a
rccos, arccos2); |
251 } | 251 } |
252 // atan2 | 252 // atan2 |
253 #if 1 | 253 #if 1 |
254 for (val = -1000; val <= 1000; val += 500.f) { | 254 for (val = -1000; val <= 1000; val += 500.f) { |
255 for (float val2 = -1000; val2 <= 1000; val2 += 500.f) { | 255 for (float val2 = -1000; val2 <= 1000; val2 += 500.f) { |
256 #else | 256 #else |
257 val = 0; { | 257 val = 0; { |
258 float val2 = -1000; { | 258 float val2 = -1000; { |
259 #endif | 259 #endif |
260 SkFixed f_val = (int) (val * 65536.0f); | 260 SkFixed f_val = SkFloatToFixed(val); |
261 SkFixed f_val2 = (int) (val2 * 65536.0f); | 261 SkFixed f_val2 = SkFloatToFixed(val2); |
262 float arctan = atan2f(val, val2); | 262 float arctan = atan2f(val, val2); |
263 SkFixed f_arctan = SkCordicATan2(f_val, f_val2); | 263 SkFixed f_arctan = SkCordicATan2(f_val, f_val2); |
264 float arctan2 = (float) f_arctan / 65536.0f; | 264 float arctan2 = (float) f_arctan / 65536.0f; |
265 float error = fabsf(arctan - arctan2); | 265 float error = fabsf(arctan - arctan2); |
266 if (error > 0.001) | 266 if (error > 0.001) |
267 SkDebugf("atan2 error : val = %g ; val2 = %g ; atan2 = %g ; cord
ic = %g\n", val, val2, arctan, arctan2); | 267 SkDebugf("atan2 error : val = %g ; val2 = %g ; atan2 = %g ; cord
ic = %g\n", val, val2, arctan, arctan2); |
268 } | 268 } |
269 } | 269 } |
270 // log | 270 // log |
271 #if 1 | 271 #if 1 |
272 for (val = 0.125f; val <= 8.f; val *= 2.0f) { | 272 for (val = 0.125f; val <= 8.f; val *= 2.0f) { |
273 #else | 273 #else |
274 val = .5; { | 274 val = .5; { |
275 #endif | 275 #endif |
276 SkFixed f_val = (int) (val * 65536.0f); | 276 SkFixed f_val = SkFloatToFixed(val); |
277 // acos | 277 // acos |
278 float log = logf(val); | 278 float log = logf(val); |
279 SkFixed f_log = SkCordicLog(f_val); | 279 SkFixed f_log = SkCordicLog(f_val); |
280 float log2 = (float) f_log / 65536.0f; | 280 float log2 = (float) f_log / 65536.0f; |
281 float error = fabsf(log - log2); | 281 float error = fabsf(log - log2); |
282 if (error > 0.001) | 282 if (error > 0.001) |
283 SkDebugf("log error : val = %g ; log = %g ; cordic = %g\n", val, log
, log2); | 283 SkDebugf("log error : val = %g ; log = %g ; cordic = %g\n", val, log
, log2); |
284 } | 284 } |
285 // exp | 285 // exp |
286 #endif | 286 #endif |
287 } | 287 } |
288 | 288 |
289 #endif | 289 #endif |
OLD | NEW |