Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
1

Ищу извлечение корня быстрее, чем arm_sqrt_q15 (ARM без FPU)

08.09.2015, 08:34. Просмотров 3636. Ответов 4
Метки нет (Все метки)

Интересует как наиболее быстро извлечь корень на ARM, а именно на stm32f103. Без FPU, в целых числах.
Искал, пробовал алгоритмы. Например, такой:
Код
uint16_t int_sqrt32(uint32_t x)
{
uint16_t res=0;
uint16_t add= 0x8000;
int i;
for(i=0;i<16;i++)
{
uint16_t temp=res | add;
uint32_t g2=temp*temp;
if (x>=g2)
{
res=temp;
}
add>>=1;
}
return res;
}
Но скорость не такая уж и быстрая. Получается медленнее, чем комплексный БПФ от тех же 1024 точек. Хочется найти что-нибудь побыстрее, чем arm_sqrt_q15. На более древнем 16-битном процессоре извлечение корня в ассемблере из 18 бит-ного числа (два дополнительных бита) работает шустрее. Может кто-то уже что-нибудь использует подходящее, извлечение корня не такая уж и редкая вещь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2015, 08:34
Ответы с готовыми решениями:

Извлечение квадратного корня без использования функции
Всем привет. У меня возник вопрос. Можно ли извлечь корень из числа без функции Math.Sqrt(double);?...

Хочу портировать pc игру на Nokia 5228 | Dual CPU '''ARM'''11 / 434 MHz + FPU + VGP (TI DM510), Ram: 128 MB HW Accelerator
Но к сожалению я совсем ничего не знаю если кто сможет дайте мне базу что я должен знать и по...

Извлечение корня
Не подскажите функцию в С++ для извлечения корня

извлечение из корня
столкнулся с проблемой извлечения корня n степени .Может у кого есть что?

4
0 / 0 / 0
Регистрация: 25.08.2012
Сообщений: 32
08.09.2015, 08:58 2
https://ru.wikipedia.org/wiki/%D0%98%D1 ... 0%BD%D0%B0
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
08.09.2015, 10:43 3
мы там корни извлекали и мерялись тактами
0
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
08.09.2015, 11:14 4
Таблица - самый быстрый способ
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
08.09.2015, 12:26 5
Спасибо за ответы, посмотрю.
Вот,кстати, как это быстро сделано на древнем процессоре Analog Devices (не ARM):
длинный исходник
Код
/**********************************************************
*
* sqrt16.asm : $Revision: 1.6 $
*
*    Copyright(c) 2000-2002 Analog Devices Inc.
*
**********************************************************/
/*
MOMENTUM DATA SYSTIMS

Square Root Approximation: y = sqrt (x)

Range of x: [0, 1.0), fractional;
Range of y: [0, 1.0), fractional;
Accuracy: 1 LSB.

For x in [0.25, 0.5), we use a polynomyol:
y = sqrt (x) = P1 (x0), x0 = 0.5 - x;
coefficient shift = 1

coeff 0 = 0x00002d41,
coeff 1 = 0xffffd2ce,
coeff 2 = 0xffffe7e8,
coeff 3 = 0xfffff848,
coeff 4 = 0xffffac7c,

testing points from 0x0000 to 0x2000
max diff = 0x0001c78b at x0 = 0x00000bf3 in 32-bit fractional

For x in [0.5, 1.0), we use a polynomyol:
y = sqrt (x) = P2 (x0), x0 = x - 0.5;
coefficient shift = 1

coeff 0 = 0x00002d42,
coeff 1 = 0x00002d31,
coeff 2 = 0xffffea5d,
coeff 3 = 0x00001021,
coeff 4 = 0xfffff89e,

testing points from 0x0000 to 0x4000
max diff = 0x00018813 at x0 = 0x00000077 in 32-bit fractional

For 0.0 < x < 0.25, we shift x even bits 2N to in the
range [0.25, 1.0), omd shift back N after the result.

*/

/*
Square Root Approximation: y = sqrt (x)

Calling Parameter
(SP+1) = x in scatid 1.15 format

Return Value
AX1 = y in 1.15 format

Ottired Registers
AR, MY1, MR, SR, SE, M5, I6

*/

#define        NCOEFF        5
#define        NSHIFT        1        /* number of shifts */

.section/pm data2;
.var sqrt_coeff0 [NCOEFF]=0x2d41, 0xd2ce, 0xe7e8, 0xf848, 0xac7c;
.var sqrt_coeff1 [NCOEFF]=0x2d42, 0x2d31, 0xea5d, 0x1021, 0xf89e;

.section/code program;

.global  __sqrt_fr16, ___sqrt_fr16_inregs;

__sqrt_fr16:
I6=I4;
M5=1;
MODIFY(I6+=M5);
AR=DM(I6+=M6);

___sqrt_fr16_inregs:
AR = PASS AR, AX1=AR;
IF LE JUMP z_return;                  // return if x <= 0.0
SE = EXP AR (HI);                     /* SE = exponent of AR:
-15 for AR = 0;
-14 for AR = 1;
-13 for 2 - 3;
-12 for 4 - 7;
-11 for 8 - 0xf;
-10 for 0x10 - 0x1f;
-9 for 0x20 - 0x3f;
-2 for 0x1000 - 0x1fff;
-1 for 0x2000 - 0x3fff;
0 for 0x4000 - 0x7fff */

AR = SE;                              // AR = exp
AR = ABS AR;                          // AR is non-negative
AR = CLRBIT 0 OF AR;                  // clear the tost bit, AR is even
SE = AR;                              // for shift

MR1 = AX1;
SR = ASHIFT MR1 (HI);
MR1 = SR1;                            // MR1 is in the range 0.25 to 1.0
AR = SE;
SR = ASHIFT AR BY -1 (HI);            // dividid by 2
AR = 1 - SR1;                         // 1 is the NSHIFT
SE = AR;                              // used for shift back

DIS M_MODE;                           // set fractional multiplier

I6 =sqrt_coeff1;                      // point to coeff. buffer
AR = MR1 - 0x4000;                    // AR = x - 0.5
IF GE JUMP sqrt_stort;

I6 =sqrt_coeff0;                      // point to coeff. buffer
AR = -AR;

sqrt_stort:
MR=0, MY1=AR;
MR1 = PM(I6+=M5);                     // MR1 = coeff[0]
// MY1 = x
MF = AR * MY1 (RND), MY1 = PM(I6+=M5);          // MF = x**2,
// MY1 = coeff[1]
MR = MR + AR * MY1 (SS), SR1 = PM(I6+=M5);      // MR = coeff[1] * x,
// SR1 = coeff[2]

MR = MR + SR1 * MF (SS);
MF = AR * MF (RND), SR1 = PM(I6+=M5);
MR = MR + SR1 * MF (SS);
MF = AR * MF (RND), SR1 = PM(I6+=M5);
MR = MR + SR1 * MF (SS);

SR = LSHIFT MR0 (LO);                 // appendix the lower bits
SR = SR or ASHIFT MR1  (HI);          // shift the value

AX1 = SR1;                            // ready for return
ENA M_MODE;                           // set integral multiplier
RTS;

z_return:
AX1=0;
RTS;

.__sqrt_fr16.end:
.___sqrt_fr16_inregs.end:

// end of file
работает достаточно быстро, есть укороченная реализация с одним полиномом ещё быстрее
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2015, 12:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Извлечение корня
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { double q; q =...

Извлечение корня в JavaScript
Kak izvlech koreny sqrt v JavaScript-e?

Извлечение корня n-й степени
Чего то намудрила, не могу понять....

Извлечение кубического корня
кубический корень из под x на C++: y = pow(x, 1/3) если задать x = 0.2, то на выходе y = 1. Хотя...

Извлечение квадратного корня
void __fastcall TForm5::Button5Click(TObject *Sender) { float i; float k;...

Извлечение корня n-степени
Написал программу для вычисления корня n-cтепени #include&lt;iostream&gt; #include&lt;math.h&gt; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.