Не харесвам тип данни float/double (в Arduino UNO/Nano/Pro Mini двата типа са еднакви).
Използвам ги ако няма какво друго да се направи (а то винаги има, само трябва време "да се сетиш" за начина

)
От днес:
Управление на Si70, фрагмент от кода:
int32_t freq_center;
int32_t freq_delta_l;
int32_t freq_delta_h;
int32_t f;
интересната част:
--------------------
freq_center = freq;
freq_delta_l = freq_center - 3500 * 0.000001 * freq_center; // + 3500 ppm
freq_delta_h = freq_center + 3500 * 0.000001 * freq_center; // - 3500 ppm
--------------------
Заета памет: FLASH: 4288 байта / RAM: 264 байта
заменяме с
--------------------
freq_center = freq;
int32_t dF = (int32_t)((uint64_t)3500 * freq_center / 1000000);
freq_delta_l = freq_center - dF; // + 3500 ppm
freq_delta_h = freq_center + dF; // - 3500 ppm
--------------------
FLASH: 3578 байта / RAM: 264 байта
От "нищото" спестяваме 710 байта, ноооо ... и още:
Пример тестов:
Пресмятане на коефициенти за ресет при централна честота freq = 145775000 Hz
Код за потвърждение:
int32_t freq = 145775000;
int32_t freq_center;
int32_t freq_delta_l;
int32_t freq_delta_h;
//------------------------------------------------------------------------------------
void setup() {
Serial.begin(57600);
freq_center = freq;
freq_delta_l = freq_center - 3500 * 0.000001 * freq_center; // + 3500 ppm
freq_delta_h = freq_center + 3500 * 0.000001 * freq_center; // - 3500 ppm
Serial.println(freq_delta_l);
Serial.println(freq_delta_h);
freq_delta_l = freq_center - (uint32_t)((uint64_t)3500 * freq_center / 1000000); // + 3500 ppm
freq_delta_h = freq_center + (uint32_t)((uint64_t)3500 * freq_center / 1000000); // - 3500 ppm
Serial.println(freq_delta_l);
Serial.println(freq_delta_h);
}
//------------------------------------------------------------------------------------
void loop() {
}
Резултати:
В случая с float:
Fl = 145264800
Fh = 146285216
В случая с uint64_t:
Fl = 145264788
Fh = 146285212
В случай, изчислено с калкулатор:
Fl = 145775000 - 3500/1000000 * 145775000 = 145264787,5
Fh = 145775000 + 3500/1000000 * 145775000 = 146285212,5
В първия случай (с float) хем грешно смята (заради недост. разряди след запетаята), че и повече памет заема

.
Споменах ли, че не харесвам float ...
