
Последние записи
- Проверка на шестнадцатеричный формат записи
- Отдать пользователю файл с помощью file_get_contents()
- Написать собственую функцию operator[] для битов
- Проблема с движением 2D человека
- OpenGl.Создание винтовой лестницы
- Склеить несколько файлов в один
- Windows 10 сменить администратора
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами

Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
25th
Май
Как на ATtiny2313 посчитать LN, sqr,sqrt, sin,cos
Posted by Chas under Пост-обзор
Думаю от модели avr это не зависит т.к. у всех AVR аппаратных таких команд нет, кроме сложения, вычитания и в некоторых моделях есть умножение. Алгоритмы по умножению и делению у меня есть их можете не советовать, я это осуществляю столбиком.
Mikl___:
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;
}
а вообще посмотри здесь
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;
}[/code]
Недостаток данного алгоритма - количество итераций будет увеличиваться с ростом Х
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
[code]{ 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)
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas

Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)