|
вычисление корня, быстрое вычисление приближённого корня |
|
|
|
 |
Ответов
(1 - 11)
|
Jun 30 2013, 19:34
|

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

|
Цитата(haki @ Jun 30 2013, 22:24)  ATMega8515. Не имеет FPU. ИМС во многом минималистична. Но если ей необходимо вычислять периоды шага для шагового двигателя, встаёт вопрос быстрого вычисления корня для формул разгона и торможения. Собственно сам вопрос заключается в том, как быстро вычислять корни используя лишь сложение, вычитание и умножение. При этом желательно оставаться в области целых чисел эмулирующих псевдо натуральные с фиксированной точкой для простоты. Примерная формуля выглядит следующим образом: N = x*sqrt(y). это сильно упрощённая формула для наглядности. Уоррен "Алгоритмические трюки для программистов", там есть "аппаратный" алгоритм на Си: Код unsigned x, y; unsigned sqrt(){ y = 0; unsigned m = 1 << 30; while( m ){ unsigned b = y | m; y >>= 1; if( x >= b ){ x -= b; y |= m; } m >>= 2; } }
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jun 30 2013, 19:53
|

Участник

Группа: Участник
Сообщений: 17
Регистрация: 19-11-12
Из: Екб
Пользователь №: 74 468

|
Цитата(kovigor @ Jul 1 2013, 01:34)  Можно использовать, например, табличный метод, или алгоритм "цифра за цифрой" (CORDIC). А почему вы на Си не пишете ? Я не говорил про язык, тут речь про алгоритм. Таблицы не уместны. Посмотрите сколько памяти у МК, еле хватает на переменные.
--------------------
|
|
|
|
|
Jul 9 2013, 19:01
|
Знающий
   
Группа: Свой
Сообщений: 608
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111

|
Если достаточно найти целую часть, то можно воспользоваться методом из википедии Цитата Арифметическое извлечение квадратного корня
Для квадратов чисел верны следующие равенства: 1 = 1^2 1 + 3 = 2^2 1 + 3 + 5 = 3^2 \sum^n_{k=1}{(2k-1)}=n^2 и так далее.
То есть, узнать целую часть квадратного корня числа можно, вычитая из него все нечётные числа по порядку, пока остаток не станет меньше следующего вычитаемого числа или равен нулю, и посчитав количество выполненных действий. Например, так:
9-1=8 8-3=5 5-5=0
Выполнено 3 действия, квадратный корень числа 9 равен 3.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|