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

 
 
 
Reply to this topicStart new topic
> Квадратный корень из целочисленного значения.
Guest_TSerg_*
сообщение Sep 23 2016, 20:41
Сообщение #1





Guests






Просто для затравки.
Есть много способов - от Герона до рядов и до битных вычислений.

Еще один способ ( не претендуя на оригинальность - геометрический, итерационный).
Основан на приближении C^2 = A^2 + B^2.
Число итераций практически Ln(N).
Не очень быстрый, это факт (3..11 итераций).
Известен давно, но доработан до минимизации средней ошибки.

Код (Pascal):
http://shot.qip.ru/00gZ9L-5OPovQGI0/

График ошибок (X = 10..100 тыс.), [%]:
http://shot.qip.ru/00gZ9L-2OPovQGI2/

Число итераций (X = 10..100 тыс.):
http://shot.qip.ru/00gZ9L-4OPovQGI4/
Go to the top of the page
 
+Quote Post
andyp
сообщение Sep 24 2016, 09:59
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(TSerg @ Sep 23 2016, 23:41) *
Просто для затравки.
Есть много способов - от Герона до рядов и до битных вычислений.

Еще один способ ( не претендуя на оригинальность - геометрический, итерационный).
Основан на приближении C^2 = A^2 + B^2.
Число итераций практически Ln(N).
Не очень быстрый, это факт (3..11 итераций).
Известен давно, но доработан до минимизации средней ошибки.


Там еще и деление на каждой итерации... Печаль. Лучше выбрать нечто более вычислительно простое из горы методов, предложенных здесь:

https://en.wikipedia.org/wiki/Methods_of_co...ng_square_roots

Я сам полиномиальную аппроксимацию для нормализованных чисел использую. Получается:
Нормализация -> вычисление полинома степени 3 по схеме Горнера ->денормализация (половина сдвигов нормализации + умножение, если при нормализации количество сдвигов было нечетным)
Go to the top of the page
 
+Quote Post
Alex11
сообщение Sep 25 2016, 18:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Я делал в свое время для DSP от TI с однотактным умножением методом последовательного приближения с дополнительными ухищрениями. Получилось лучше, чем в стандартной библиотеке. Точное количество тактов сейчас не помню, и текста нет под рукой - я в отпуске.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Sep 27 2016, 12:53
Сообщение #4


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(TSerg @ Sep 23 2016, 23:41) *
Просто для затравки.
Есть много способов - от Герона до рядов и до битных вычислений.

Еще один способ ( не претендуя на оригинальность - геометрический, итерационный).
Основан на приближении C^2 = A^2 + B^2.
Число итераций практически Ln(N).
Не очень быстрый, это факт (3..11 итераций).
Известен давно, но доработан до минимизации средней ошибки.

Код (Pascal):
http://shot.qip.ru/00gZ9L-5OPovQGI0/

График ошибок (X = 10..100 тыс.), [%]:
http://shot.qip.ru/00gZ9L-2OPovQGI2/

Число итераций (X = 10..100 тыс.):
http://shot.qip.ru/00gZ9L-4OPovQGI4/

в свое время я его реализовал на FPGA


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post

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

 


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


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