Только что по приколу попробовал оба вида расчета.
Подключение библиотеки math.h и расчет экспоненты съедает 4к флеша и порядка 250 байт оперативной памяти.
Код:
#include <math.h>
...
uint8_t i;
double d;
double volatile p=0;
d=1.545444342+i;
p=p+exp(d);
if (p==0)
p=1;
}
Выполняется примерно 5300 тактов процессора. А там еще наверняка надо будет выполнить кучу действий, кроме вычисления экспоненты (умножения, деления..).
Код с аппроксимацией 16-битных значений
Код:
#define Temp1Count 5
uint16_t Temp1[Temp1Count][2] PROGMEM =
// первое значение - абсцисса, второе - ордината
{
{0,40},
{5,80},
{26,200},
{42,300},
{70,400},
};
...
uint16_t InTemp;
uint16_t RealTemp;
uint16_t InLeftTemp;
InTemp=5;
i=Temp1Count;
do
{
i--;
InLeftTemp=pgm_read_word(&Temp1[i][0]);
}
while ((i>=0)&&(InTemp<InLeftTemp));
uint16_t InRightTemp=pgm_read_word(&Temp1[i+1][0]);
uint16_t OutLeftTemp=pgm_read_word(&Temp1[i][1]);
uint16_t OutRightTemp=pgm_read_word(&Temp1[i+1][1]);
RealTemp=OutLeftTemp+(OutRightTemp-OutLeftTemp)*(InTemp-InLeftTemp)/(InRightTemp-InLeftTemp);
if (RealTemp==81)
...
Основное затраченное время - выполнение умножений и делений. Выполняется порядка 350 тактов при 4х попаданиях в цикл (20 тактов на цикл). Съедает порядка 160 байт флеш-памяти, не ест оперативную память.
Тут правда надо четко просчитать, чтобы не было переполнений при умножении, либо вычисление RealTemp делать в int32.
В общем все зависит от необходимой точности и наличия ресурсов.