GetSmart 0 16 декабря, 2018 Опубликовано 16 декабря, 2018 · Жалоба Алгоритмический нежданчик. Кусочно-линейная интерполяция 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 16 декабря, 2018 Опубликовано 16 декабря, 2018 · Жалоба В этом коде ужасно все :) И форматирование, и алгоритм, и названия переменных. Быстрее одного деления он будет работать недолго, только если у вас итераций мало. Если в таблице будет хотя бы сотня значений. А главное, кусочно линейная интерполяция и не требует целочисленного деления, если у вас грамотно выбрано кол-во элементов. Всегда можно обойтись делением на степень двойки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dvil 0 11 января, 2019 Опубликовано 11 января, 2019 · Жалоба 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); } А на какой архитектуре, вы это делаете ? Что за платформа ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться