реклама на сайте
подробности

 
 
> Очень нужна помощь в оптимизации алгоритма извлечения квадратного корня
Rostislav
сообщение Dec 4 2012, 22:16
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765



Ребята, всем привет! Помогите, пожалуйста оптимизировать алгоритм извлечения корня. А то что-то до фига получается циклов вычисления. Заранее огромное спасибо всем откликнувшимся!

Алгоритм простой, основан на методе последовательного приближения. Собственно вот он (без шелухи):

bprev:=bprev div 2;
if (b+bprev)*(b+bprev) > a then
b:=b-bprev
else
if (b+bprev)*(b+bprev) < a then
b:=b+bprev
else
выход;
повтор цикла....

Полный текст:

a:word;
b:word;
bprev:word;
cnt:word;

a:=strtoint(edit1.Text); // подкоренное выражение
b:=a; // в b хранится результат
bprev:=a;
cnt:=0;
while 1=1 do begin
cnt:=cnt+1; // Счетчик циклов
bprev:=bprev div 2;
if bprev=0 then begin
bprev:=1;
if ((b+1)*(b+1) > a) and ((b+0)*(b+0) < a) then break;
end;
if (b+bprev)*(b+bprev) > a then
b:=b-bprev
else
if (b+bprev)*(b+bprev) < a then
b:=b+bprev
else
break;
end;
b:=b+bprev;
Form1.Caption:='результат: '+inttostr(b)+' циклов: '+inttostr(cnt);

Результаты замера следующие:
sqr (1) - 2 цикла;
sqr (10) - 5 циклов;
sqr (100) - 5 циклов;
sqr (1000) - 13 циклов;
sqr (10000) - 38 циклов;
sqr (32000) - 73 цикла;
...

Алгоритм предложенный alexeyv:

i:=1; // результат в i
b:=1;
a:=10000; // подкоренное выражение
while 1=1 do begin
if (b > a) or (b = a) then break;
b:=b+2;
a:=a-b;
i:=i+1;
end;
caption:=inttostr(i);

sqr (10000) - 100 циклов.

Сообщение отредактировал Rostislav - Dec 5 2012, 07:35
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alexeyv
сообщение Dec 5 2012, 03:37
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Если нужна только целая часть квадратного корня, то можно воспользоваться другим алгоритмом:

Для квадратов чисел верны следующие равенства:
1 = 1^2
1+3 = 2^2
1+3+5 = 3^2
и так далее.

То есть, узнать целую часть квадратного корня числа можно, вычитая из него все нечётные числа по порядку, пока остаток не станет меньше следующего вычитаемого числа или равен нулю, и посчитав количество выполненных действий. Например, так:
Выполнено 3 действия, квадратный корень числа 9 равен 3.

Недостатком такого способа является то, что если извлекаемый корень не является целым числом, то можно узнать только его целую часть, но не точнее. В то же время такой способ вполне доступен детям, решающим простейшие математические задачи, требующие извлечения квадратного корня.

Циклов конечно будет больше, зато время их выполнения гораздо меньше
Go to the top of the page
 
+Quote Post
Rostislav
сообщение Dec 5 2012, 06:09
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765



Цитата(alexeyv @ Dec 5 2012, 06:37) *
1 = 1^2
1+3 = 2^2
1+3+5 = 3^2
и так далее.


Забавный алгоритм))

Т.е. если я Вас правильно понял, то программа должна выглядеть так:

a=подкоренное выражение
b=1
i=1

цикл
если b > a или b = a то
....выход (результат в i)
иначе
....b=b+(b+2)
....i=i+1
повтор цикла

Так?

Сообщение отредактировал Rostislav - Dec 5 2012, 06:30
Go to the top of the page
 
+Quote Post
Tanya
сообщение Dec 5 2012, 06:28
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Rostislav @ Dec 5 2012, 10:09) *
Забавный алгоритм))

Что Вас так забавляет?
Немного школьной арифметики...
Сумма арифметической прогрессии дает - сумма N нечетных чисел в точности равна N в квадрате.
Следующий разряд (после точки) можно вычислить как (половина остатка)/N.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Rostislav   Очень нужна помощь в оптимизации алгоритма извлечения квадратного корня   Dec 4 2012, 22:16
- - Rostislav   Что забавляет? Все)) Магия чисел в особенности)) ...   Dec 5 2012, 06:55
|- - MrYuran   Цитата(Rostislav @ Dec 5 2012, 10:55) Где...   Dec 5 2012, 06:59
- - Rostislav   Кстати, детская арифметика заканчивается начиная с...   Dec 5 2012, 07:11
- - skyv   Я использовал просто таблицу, которую предваритель...   Dec 5 2012, 10:59
|- - Rostislav   Цитата(skyv @ Dec 5 2012, 13:59) Я исполь...   Dec 5 2012, 11:04
|- - Lmx2315   QUOTE (Rostislav @ Dec 5 2012, 15:04) А В...   Dec 5 2012, 11:14
|- - skyv   Цитата(Lmx2315 @ Dec 5 2012, 15:14) ..мог...   Dec 6 2012, 10:52
- - MrYuran   Можно скомбинировать. Таблицу для грубого опреде...   Dec 5 2012, 11:28
|- - Rostislav   Цитата(MrYuran @ Dec 5 2012, 14:28) Можно...   Dec 5 2012, 11:39
- - sysel   Не знаю, как называется метод, но пашет: Код// Выч...   Dec 5 2012, 13:56
- - анатолий   Вот функция корня по алгоритму CORDIC Кодfunction ...   Dec 8 2012, 21:23
|- - Rostislav   Цитата(анатолий @ Dec 9 2012, 00:23) Вот ...   Dec 11 2012, 06:07
|- - анатолий   Цитата(Rostislav @ Dec 11 2012, 08:07) чт...   Dec 11 2012, 19:16
- - TSerg   Кодfunction intSqrt_(Val : Longword) ...   Dec 11 2012, 11:41
|- - akorud   Есть возможность использовать floating-point? Може...   Dec 11 2012, 18:41
- - VitekSVM   http://algolist.manual.ru/maths/count_fast/index.p...   Dec 20 2012, 13:41
- - ASN   Rostislav С какой практической точностью нужно выч...   Dec 20 2012, 14:38
|- - Rostislav   Цитата(ASN @ Dec 20 2012, 17:38) С какой ...   Dec 20 2012, 20:46
|- - beaRTS   Цитата(Rostislav @ Dec 21 2012, 00:46) [c...   Dec 21 2012, 02:07
|- - Rostislav   Цитата(beaRTS @ Dec 21 2012, 05:07) temp ...   Dec 21 2012, 05:56
|- - beaRTS   Цитата(Rostislav @ Dec 21 2012, 08:56) Да...   Dec 21 2012, 06:16
|- - Rostislav   Цитата(beaRTS @ Dec 21 2012, 09:16) а, ну...   Dec 21 2012, 06:19
- - blackfin   Сто раз уже обсуждали: ReAl.   Dec 21 2012, 06:19
|- - Rostislav   Цитата(blackfin @ Dec 21 2012, 09:19) Сто...   Dec 21 2012, 06:24
|- - beaRTS   Цитата(blackfin @ Dec 21 2012, 09:19) Сто...   Dec 21 2012, 06:27
|- - Rostislav   Цитата(beaRTS @ Dec 21 2012, 09:27) ...я ...   Dec 21 2012, 06:31
- - TSerg   Топик-стартер слушает только себя в попытке изобре...   Dec 21 2012, 07:12
|- - Rostislav   Цитата(TSerg @ Dec 21 2012, 10:12) Топик-...   Dec 21 2012, 11:10
|- - beaRTS   Цитата(Rostislav @ Dec 21 2012, 14:10) ЗЫ...   Dec 22 2012, 08:50
|- - beaRTS   Цитата(Rostislav @ Dec 21 2012, 14:10) ЗЫ...   Dec 22 2012, 09:01
|- - TSerg   Цитата(Rostislav @ Dec 21 2012, 15:10) Ва...   Dec 22 2012, 17:47
- - Rostislav   TSerg, Ваш вариант описывается тут: http://en.wiki...   Dec 22 2012, 08:25
- - beaRTS   по поводу своей идеи начал новую тему. вот здесь к...   Dec 22 2012, 16:06


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 11:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016