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

 
 
> Очень нужна помощь в оптимизации алгоритма извлечения квадратного корня
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
Ответов
Guest_TSerg_*
сообщение Dec 21 2012, 07:12
Сообщение #2





Guests






Топик-стартер слушает только себя в попытке изобрести велосипед.sm.gif

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

Еще раз приведу (для 16р сетки), число иттераций всегда 9 и никаких умножений.

function QuickSqrt_(Val : word) : word;
var bitSqr : word;
begin
bitSqr := $10000;
Result := 0;

While bitSqr <> 0 do begin
if (Val >= bitSqr + Result) then begin
Dec(Val, bitSqr + Result);
Result := (Result shr 1) or bitSqr;
end
else Result := Result shr 1;
bitSqr := bitSqr shr 2;
end;
end;
Go to the top of the page
 
+Quote Post
Rostislav
сообщение Dec 21 2012, 11:10
Сообщение #3


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

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



Цитата(TSerg @ Dec 21 2012, 10:12) *
Топик-стартер слушает только себя в попытке изобрести велосипед.sm.gif

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


Уважаемый TSerg, ну тё Вы ругаетесь? Себя я, конечно же, слушаю))) Велосипед? Да, изобретаю! Не мешайте мне побыть гениальнымbiggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif

Ваш вариант действительно очень эффективен. Да, выполняется за всего за 9 циклов! Я бы добавил его в начало темы, но не могу. Первое сообщение не доступно уже для изменения.

Более того, в последнем Вашем коде есть ошибка: bitSqr : word. Это говорит о том, что Вы лично его не проверяли в деле.

Судя по тому, что маске присваивается значение 0x010000, маска bitSqr должна быть 32-х разрядной (как и было в первом Вашем варианте). Далее в коде все операции с ней происходят как с 32-х разрядным числом (компилятор не будет динамически менять разрядность), это требует дополнительной памяти данных и инструкций. Это первое.

Второе. Объем кода в Вашем варианте мне показался больше, чем в моем (к тому же, учитывая операции с 32-х разрядным числом в микроконтроллере с 8-ми разрядной архитектурой (даже с аппаратным умножителем 8х8), например). Но это на вскидку. Если все совсем делать серьезно, то, по идее, оба алгоритма нужно перевести на ассемблер микроконтроллера PIC16, например, и сравнить.

Но, Ваш код прост. Мой имеет один (?) недостаток - операция умножения. В микроконтроллере с аппаратным умножителем это не будет проблемой, в остальных да.

Вариантов, действительно, было множество. Но ищется оптимальный (имеющий малый объем кода, простоту вычислений, быстрый). Не все они отвечают этим требованиям. И вкус, часто определяется архитектурой вычислительного ядра. Ищу золотую середину)))

ЗЫ. Кстати, очень интересно какие все же идеи есть у beaRTS)))

Сообщение отредактировал Rostislav - Dec 21 2012, 11:16
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Dec 22 2012, 17:47
Сообщение #4





Guests






Цитата(Rostislav @ Dec 21 2012, 15:10) *
Ваш вариант действительно очень эффективен. Да, выполняется за всего за 9 циклов! Я бы добавил его в начало темы, но не могу. Первое сообщение не доступно уже для изменения.

Более того, в последнем Вашем коде есть ошибка: bitSqr : word. Это говорит о том, что Вы лично его не проверяли в деле.


Это не мой вариант, но давно известный.

bitSqr := $FFFF;

Да, чисто механически оттранслировал на 16рsm.gif
Delphi исправляет мою погрешность, но в микроконтроллере надо быть внимательнее, конечно же.

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Rostislav   Очень нужна помощь в оптимизации алгоритма извлечения квадратного корня   Dec 4 2012, 22:16
- - alexeyv   Если нужна только целая часть квадратного корня, т...   Dec 5 2012, 03:37
|- - Rostislav   Цитата(alexeyv @ Dec 5 2012, 06:37) 1 = 1...   Dec 5 2012, 06:09
|- - Tanya   Цитата(Rostislav @ Dec 5 2012, 10:09) Заб...   Dec 5 2012, 06:28
- - 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
|- - beaRTS   Цитата(Rostislav @ Dec 21 2012, 14:10) ЗЫ...   Dec 22 2012, 08:50
|- - beaRTS   Цитата(Rostislav @ Dec 21 2012, 14:10) ЗЫ...   Dec 22 2012, 09:01
- - 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 Текстовая версия Сейчас: 18th June 2025 - 11:00
Рейтинг@Mail.ru


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