Как взять корень, чтобы поменьше циклов было??? У меня такая проблема. Кварц 32768. Проц должен за 300 мс найти корень из целого числа (X) в диапазоне от 625 до 10000. Нужно получить корень но с точностью два занака, т.е например, корень(1000)= 31.62 = (3162)
Беру следующим образом (итерациями):
Если (X<=2500) то итерации такие (y1 =) y + (X - y^2)
Если (X>2500), то такие (y1 =) y + (X - y^2)/2.
Вроде считает правильно, но самое максимальное получается 13 итераций. в итоге занимает примерно 850 мс. Очень долго.
Посмотрел, оказалось, что больше всего занимает место перемножение двух 16 рарядных целых чисел(квадрат y^2). примерно 450 циклов в каждой итерации.
Не подскажите как можно кадрат сделать в циклов 100. или как корень побыстрее сдлеать.
Использую PIC16.
Пробывал по другому
do
// {
// a = b;
// b = (a + c/a)/2;
// } while (a > b);
Получается секунды 2. Из-за того, что все числа long int;
Заранее спасибо
tS16 Sqrt(tS16 value)
{
tS16 Result;
tAll a;
tS16 b;
tU8 c;
tAll temp;
{
// c = 10000;
// c = c*Result;
// b = c;
// do
// {
// a = b;
// b = (a + c/a)/2;
// } while (a > b);
// }
// Result = a;
// return Result;
a.L = Result * 429496;
b = 1;
temp.I[0] = a.I[1];
temp.I[1] = a.I[1];
while(b>0)
{
a.L = (tU32)temp.I[0]*(tU16)temp.I[0];
b = (temp.I[1] - a.I[1]);
if (c > 9)
{
b =b>>2;
}
temp.I[0]+=b;
} ;
}
a.L = (tU32)temp.I[0] * 10000;
return a.I[1];
}