Перейти к содержанию
    

Квадратный корень из целочисленного значения.

Гость TSerg

Просто для затравки.

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

 

Еще один способ ( не претендуя на оригинальность - геометрический, итерационный).

Основан на приближении 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/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто для затравки.

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

 

Еще один способ ( не претендуя на оригинальность - геометрический, итерационный).

Основан на приближении C^2 = A^2 + B^2.

Число итераций практически Ln(N).

Не очень быстрый, это факт (3..11 итераций).

Известен давно, но доработан до минимизации средней ошибки.

 

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

 

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

 

Я сам полиномиальную аппроксимацию для нормализованных чисел использую. Получается:

Нормализация -> вычисление полинома степени 3 по схеме Горнера ->денормализация (половина сдвигов нормализации + умножение, если при нормализации количество сдвигов было нечетным)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делал в свое время для DSP от TI с однотактным умножением методом последовательного приближения с дополнительными ухищрениями. Получилось лучше, чем в стандартной библиотеке. Точное количество тактов сейчас не помню, и текста нет под рукой - я в отпуске.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто для затравки.

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

 

Еще один способ ( не претендуя на оригинальность - геометрический, итерационный).

Основан на приближении 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...