Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2011, 07:25   #1
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
Радость LN, sqr,sqrt, sin,cos и др. на МК AVR

Привет ребят!
У меня вопрос не знает ли как на ATtiny2313 посчитать LN, sqr,sqrt, sin,cos.

Думаю от модели avr это не зависит т.к. у всех AVR аппаратных таких команд нет, кроме сложения, вычитания и в некоторых моделях есть умножение. Алгоритмы по умножению и делению у меня есть их можете не советовать, я это осуществляю столбиком.

Желательно укажите литературу или алгоритмы.
wanes101 вне форума Ответить с цитированием
Старый 11.04.2011, 11:57   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

wanes101
1) разложение в ряд Тейлора
2) табличное преобразование для тригонометрических функций
3) sqr вообще-то квадрат, а его через умножение
4) sqrt вычисление целочисленного квадратного корня
Код:
int isqrt4(unsigned x) { // Hardware algorithm [GLS]
   unsigned m, y, b;
   m = 0x40000000;
   y = 0;
   while(m != 0) {              // Do 16 times.
      b = y | m;
      y = y >> 1;
      if (x >= b) { x = x - b;  y = y | m; }
      m = m >> 2;
   }
   return y;
}
а вообще посмотри здесь
1) Самый известный целочисленный алгоритм для вычисления квадратного корня из числа поражает своей простотой
Код:
unsigned sqrt_cpu_int(usigned X)
    {    unsigned div = 1, result = 0; 
        while (X > 0)
        {    X -= div;  div += 2; result += X < 0 ? 0 : 1;     }
        return result; 
    }
Недостаток данного алгоритма - количество итераций будет увеличиваться с ростом Х
2) вычисление квадратного корня по разложению в ряд Тейлора.
Пусть Х - любое число; f(X) - некоторая функция, зависящая от X; a - известное число, близкое к Х; f(a) - известное значение функции.
Разложим f(X) в ряд Тейлора:
f(X)=f(a)+(X-a)f'(a)+((X-a)² *f"(a))/2! + ... + ((X-a)^n *f^n (a))/n!
Пусть X - число, из которого нужно извлечь корень. Тогда f(X)=√X; a - известное число близкое к X; f(a)=√a - известное число близкое к √X, и f(X)=√a +(X-a)/(2√a)+...=(2a+X-a)/(2√a)=(a+X)/(2√a)
Величина √X может быть найдена, если задаться величиной √a и затем вычислить f(X). f(X)² можно сравнить с исходным числом Х. Если точность окажется недостаточной, тогда число а заменяется на f(X)², √a на f(X) и вычисление повторяется
3) поиск целочисленного квадратного корня методом Ньютона начинается с некоторого значения g(0), которое является начальной оценкой √X. Затем выполняется серия уточнений значения квадратного корня по формуле g(n+1)=(g(n)+X/g(n))/2. Для уменьшения количество итераций можно на первом этапе более точно подобрать начальное значения для переменной g0
Код:
{ usigned x1;
  int a, g0, g1;
  if ( x <= 1 ) return x;
  a = 1;
  x1 = x - 1;
  if (x1 > 65535) {a = a + 8; x1 = x1 >> 16;}
  if (x1 > 255)   {a = a + 4; x1 = x1 >> 8;}
  if (x1 > 15)    {a = a + 2; x1 = x1 >> 4;}
  if (x1 > 3)     {a = a + 1;}
  g0 = 1 << a; // g0 = 2ª
  g1 = (g0 + (x >> a)) >> 1;
  while (g1 < g0) // повторяем, пока приближения строго уменьшаются
  { g0 = g1; g1 = (g0 + (x/g0)) >> 1}
}
4) Так как деление достаточно медленная операция, можно от нее отказаться. Для вычисления квадратного корня используем умножение. 32-разрядное число Х будет иметь 16-разрядный квадратный корень. На каждом шаге происходит уточнение 1 бита значения корня. Для ускорения сделано "безбранчевое" вычисление прибавить или отнять значение в соответствующем разряде
Код:
    mov ebx,4000h
    mov ecx,8000h
    mov eax,40000000h
@@:    cmp eax,X
    je @f; преждевременный выход из цикла
    sbb edx,edx; если CF=1 тогда edx=0FFFFFFFFh иначе edx=0
    sub ecx,ebx
    and edx,ebx; если CF=1 тогда edx=ebx иначе edx=0
    lea ecx,[ecx+edx*2]; если CF=1 тогда ecx=ecx+ebx иначе ecx=ecx-ebx
    shr ebx,1; переходим к следующему разряду
    mov eax,ecx
    mul eax; получаем "eax в квадрате"
    test ebx,ebx
    jnz @b
@@:    mov eax,ecx; eax:=sqrt(X)

Последний раз редактировалось Mikl___; 11.04.2011 в 12:31.
Mikl___ вне форума Ответить с цитированием
Старый 11.04.2011, 11:58   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

рядом?....
p51x вне форума Ответить с цитированием
Старый 11.04.2011, 12:07   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

p51x
А что вас смутило при разложении в ряд?
wanes101
вот еще Извлечение квадратного корня в столбик
а здесь вычисление натурального логарифма (Google великая штука!)

Последний раз редактировалось Mikl___; 11.04.2011 в 12:35.
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
sin ,cos,ln,lg,exp,sqr и др. wanes101 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 22.10.2014 04:24
Таблица углов sin, cos, tg и т.д neme4ta Общие вопросы по Java, Java SE, Kotlin 2 02.04.2010 15:23
Cos, Sin и непонятности с ними =\\ Zeraim Общие вопросы Delphi 3 25.07.2009 01:38
Процедура, вычисляющая Y=a*cos(G) и X=a*sin(G) Vishez Помощь студентам 4 25.04.2007 17:41