GetSmart 0 December 16, 2018 Posted December 16, 2018 · Report post Алгоритмический нежданчик. Кусочно-линейная интерполяция 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); } Quote Share this post Link to post Share on other sites More sharing options...
slavka012 0 December 16, 2018 Posted December 16, 2018 · Report post В этом коде ужасно все :) И форматирование, и алгоритм, и названия переменных. Быстрее одного деления он будет работать недолго, только если у вас итераций мало. Если в таблице будет хотя бы сотня значений. А главное, кусочно линейная интерполяция и не требует целочисленного деления, если у вас грамотно выбрано кол-во элементов. Всегда можно обойтись делением на степень двойки. Quote Share this post Link to post Share on other sites More sharing options...
Dvil 0 January 11, 2019 Posted January 11, 2019 · Report post 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); } А на какой архитектуре, вы это делаете ? Что за платформа ??? Quote Share this post Link to post Share on other sites More sharing options...