Jump to content

    
Sign in to follow this  
GetSmart

Алгоритмический нежданчик. Кусочно-линейная интерполяция быстрее одного int-деления

Recommended Posts

Алгоритмический нежданчик. Кусочно-линейная интерполяция fixed-point, выполняющаяся быстрее одного (!) софтового деления int на int, например в ARM7/CM0, которые без аппаратного. Но быстрее, если кол-во точек/изломов меньше, чем бит в int, и доступ к константам быстрый или из ОЗУ. Это такие мелочи на фоне сюрприза.

int interpol(int adc) {
static const unsigned char mas[] = { K0,K1,K2,K3...,0 };

int delta, res = ABC;
if ((adc -= 32) >= 0) {
	unsigned char const *p = &mas[0];
	while ((delta = *p++)) {
		res -= delta;
		if ((adc -= 32) < 0)	return res - (delta*adc >> 3);
	}
	delta = 256;		// наклон отриц. края
}
else delta = 256;		// наклон полож. края
return res - (delta*adc >> 3);
}

Share this post


Link to post
Share on other sites

В этом коде ужасно все :) И форматирование, и алгоритм, и названия переменных. Быстрее одного деления он будет работать недолго, только если у вас итераций мало. Если в таблице будет хотя бы сотня значений.

А главное, кусочно линейная интерполяция и не требует целочисленного деления, если у вас грамотно выбрано кол-во элементов. Всегда можно обойтись делением на степень двойки.

Share this post


Link to post
Share on other sites
On ‎12‎/‎16‎/‎2018 at 4:26 AM, GetSmart said:

Алгоритмический нежданчик. Кусочно-линейная интерполяция fixed-point, выполняющаяся быстрее одного (!) софтового деления int на int, например в ARM7/CM0, которые без аппаратного. Но быстрее, если кол-во точек/изломов меньше, чем бит в int, и доступ к константам быстрый или из ОЗУ. Это такие мелочи на фоне сюрприза.


int interpol(int adc) {
static const unsigned char mas[] = { K0,K1,K2,K3...,0 };

int delta, res = ABC;
if ((adc -= 32) >= 0) {
	unsigned char const *p = &mas[0];
	while ((delta = *p++)) {
		res -= delta;
		if ((adc -= 32) < 0)	return res - (delta*adc >> 3);
	}
	delta = 256;		// наклон отриц. края
}
else delta = 256;		// наклон полож. края
return res - (delta*adc >> 3);
}

 

А на какой архитектуре, вы это делаете ? Что за платформа ???

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this