Jump to content

    

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

Алгоритмический нежданчик. Кусочно-линейная интерполяция 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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now