вычисление квадратного корня для реализации функции с фиксированной точкой

Я пытаюсь найти квадратный корень из фиксированной точки, и я использовал следующий расчет, чтобы найти аппроксимацию квадратного корня с помощью целочисленного алгоритма. Алгоритм описан в Википедии:
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

uint32_t SquareRoot(uint32_t a_nInput)
{
uint32_t op  = a_nInput;
uint32_t res = 0;
uint32_t one = 1uL << 30; // The second-to-top bit is set: use 1u << 14 for uint16_t type; use 1uL<<30 for uint32_t type// "one" starts at the highest power of four <= than the argument.
while (one > op)
{
one >>= 2;
}

while (one != 0)
{
if (op >= res + one)
{
op = op - (res + one);
res = res +  2 * one;
}
res >>= 1;
one >>= 2;
}
return res;
}

но я не могу следить за тем, что происходит в коде, что делает комментарий // "one" starts at the highest power of four <= than the argument. точно значит. Может кто-нибудь, пожалуйста, намекните мне, что происходит в коде, чтобы вычислить квадратный корень аргумента a_nInput

Большое спасибо

0

Решение

Обратите внимание, как one инициализируется.

uint32_t one = 1uL << 30;

Это 230, или же 1073741824, Который также 415.

Эта строка:

    one >>= 2;

Эквивалентно

    one = one / 4;

Итак, псевдокод того, что происходит:

  • one = 415

  • если one больше чем a_nInput

    • one = 414
  • если one все еще больше, чем a_nInput

    • one = 413
  • (и так далее…)

В конце концов, one будут не быть больше чем a_nInput,

// "one" starts at the highest power of four less than or equal to a_nInput
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]