eina: fix computation of sqrt near 1.

This is still not so good below 1.

@fix
This commit is contained in:
Cedric BAIL 2015-10-22 16:55:10 -07:00
parent 01eaa7a9cc
commit e45b801577
4 changed files with 11 additions and 11 deletions

View File

@ -58,9 +58,9 @@ eina_f16p16_sqrt(Eina_F16p16 a)
root = 0; /* Clear root */
remHi = 0; /* Clear high part of partial remainder */
remLo = a; /* Get argument into low part of partial remainder */
count = (15 + (16 >> 1)); /* Load loop counter */
count = 16; /* Load loop counter */
do {
remHi = (remHi << 2) | (remLo >> 30);
remHi = (remHi << 16) | (remLo >> 16);
remLo <<= 2; /* get 2 bits of arg */
root <<= 1; /* Get ready for the next bit in the root */
testDiv = (root << 1) + 1; /* Test radical */

View File

@ -97,9 +97,9 @@ eina_f32p32_sqrt(Eina_F32p32 a)
root = 0; /* Clear root */
remHi = 0; /* Clear high part of partial remainder */
remLo = a; /* Get argument into low part of partial remainder */
count = (31 + (32 >> 1)); /* Load loop counter */
count = 32; /* Load loop counter */
do {
remHi = (remHi << 2) | (remLo >> 30);
remHi = (remHi << 32) | (remLo >> 32);
remLo <<= 2; /* get 2 bits of arg */
root <<= 1; /* Get ready for the next bit in the root */
testDiv = (root << 1) + 1; /* Test radical */

View File

@ -58,17 +58,17 @@ eina_f8p24_sqrt(Eina_F8p24 a)
root = 0; /* Clear root */
remHi = 0; /* Clear high part of partial remainder */
remLo = a; /* Get argument into low part of partial remainder */
count = (23 + (24 >> 1)); /* Load loop counter */
count = 24; /* Load loop counter */
do {
remHi = (remHi << 2) | (remLo >> 30);
remHi = (remHi << 8) | (remLo >> 24);
remLo <<= 2; /* get 2 bits of arg */
root <<= 1; /* Get ready for the next bit in the root */
testDiv = (root << 1) + 1; /* Test radical */
if (remHi >= testDiv)
{
remHi -= testDiv;
root++;
}
{
remHi -= testDiv;
root++;
}
} while (count-- != 0);
return (root);
}

View File

@ -180,7 +180,7 @@ START_TEST(eina_test_quaternion_f16p16)
fail_if(!eina_quaternion_cmp(&p, &q));
res = eina_quaternion_f16p16_norm(&r);
fail_if(res != 131072);
fail_if(res != 131070);
eina_quaternion_f16p16_negative(&s, &r);
fail_if(s.x != s.y ||