diff options
author | Daniel Willmann <d.willmann@samsung.com> | 2013-05-17 16:46:23 +0100 |
---|---|---|
committer | Daniel Willmann <d.willmann@samsung.com> | 2013-05-17 17:10:55 +0100 |
commit | 7c20a90c3dc0b14370d9f9c81d3ea0aee0156954 (patch) | |
tree | 38915ec4754db746cad3619644ae575d301d2c22 | |
parent | 6667acf5a2ec29cac87d4ad6656b5e9327457b86 (diff) | |
download | efl-7c20a90c3dc0b14370d9f9c81d3ea0aee0156954.tar.gz |
eina_test_fp: Test multiplication and division as well
Signed-off-by: Daniel Willmann <d.willmann@samsung.com>
-rw-r--r-- | src/tests/eina/eina_test_fp.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/tests/eina/eina_test_fp.c b/src/tests/eina/eina_test_fp.c index bdb31000aa..ef1b1d4948 100644 --- a/src/tests/eina/eina_test_fp.c +++ b/src/tests/eina/eina_test_fp.c @@ -85,9 +85,107 @@ START_TEST(eina_fp_sin) } END_TEST +START_TEST(eina_fp_mul) +{ + Eina_F32p32 fc1, fc2; + Eina_F32p32 fresult; + double dc1, dc2; + double dl1, dl2; + double step1, step2; + double dresult; + double delta, delta_per; + double maxdelta = 0; + double maxdelta_per = 0; + + fail_if(!eina_init()); + + dl1 = 10; + step1 = 0.001; + dl2 = 1000; + step2 = 0.01; + + for (dc1 = 0; dc1 < dl1; dc1 += step1) + { + for (dc2 = 0; dc2 < dl2; dc2 += step2) + { + dresult = dc1 * dc2; + + fc1 = eina_f32p32_double_from(dc1); + fc2 = eina_f32p32_double_from(dc2); + fresult = eina_f32p32_mul(fc1, fc2); + + delta = fabs(dresult - eina_f32p32_double_to(fresult)); + delta_per = delta/dresult; + if (delta > 0.008 || delta_per > 0.01) + { + printf("%f*%f = %f (delta: %f, %f%%)\n", dc1, dc2, dresult, delta, delta_per*100); + fail_if(delta > 0.005 || delta_per > 0.01); + } + if (delta > maxdelta) + maxdelta = delta; + if (delta_per > maxdelta_per) + maxdelta_per = delta_per; + } + } + printf("Max delta(multiplication): %f (%f%%)\n", maxdelta, maxdelta_per*100); + + eina_shutdown(); +} +END_TEST + +START_TEST(eina_fp_div) +{ + Eina_F32p32 fc1, fc2; + Eina_F32p32 fresult; + double dc1, dc2; + double dl1, dl2; + double step1, step2; + double dresult; + double delta, delta_per; + double maxdelta = 0; + double maxdelta_per = 0; + + fail_if(!eina_init()); + + dl1 = 10; + step1 = 0.001; + dl2 = 1000; + step2 = 0.01; + + for (dc1 = 0; dc1 < dl1; dc1 += step1) + { + for (dc2 = step2; dc2 < dl2; dc2 += step2) + { + dresult = dc1 / dc2; + + fc1 = eina_f32p32_double_from(dc1); + fc2 = eina_f32p32_double_from(dc2); + fresult = eina_f32p32_div(fc1, fc2); + + delta = fabs(dresult - eina_f32p32_double_to(fresult)); + delta_per = delta/dresult; + if (delta > 0.005 || delta_per > 0.03) + { + printf("%f/%f = %f (delta %f, %f%%)\n", dc1, dc2, dresult, delta, delta_per*100); + fail_if(delta > 0.005 || delta_per > 0.03); + } + if (delta > maxdelta) + maxdelta = delta; + if (delta_per > maxdelta_per) + maxdelta_per = delta_per; + } + } + printf("Max delta(division): %f (%f%%)\n", maxdelta, maxdelta_per*100); + + eina_shutdown(); +} +END_TEST + void eina_test_fp(TCase *tc) { tcase_add_test(tc, eina_fp_cos); tcase_add_test(tc, eina_fp_sin); + tcase_add_test(tc, eina_fp_mul); + tcase_add_test(tc, eina_fp_div); } |