ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
19098
lamerок (25.12.2004 20:46, просмотров: 3537)
Как взять корень, чтобы поменьше циклов было??? У меня такая проблема. Кварц 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];
	
}