Перейти к содержанию
    

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);
}

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...