У меня есть функция (показана ниже), в которой мне нужен совет. Функция возвращает наклон линии, которая подходит (по методу наименьших квадратов) к n точкам данных. Чтобы дать вам контекст, мой проект - баритометрический высотомер, который использует эту функцию для определения скорости, основанной на n самых последних пар высоты. Эти пары высотного времени хранятся в 2 глобальных массивах (times[]
и alts[]
).Arduino: функция float возвращает inf
Моя проблема не в том, что этот метод не работает. Обычно это происходит. Но иногда я запускаю высотомер, и эта функция вернет значение 'inf'
, перемежающееся с кучей других неправильных значений (я также видел «NaN», но это реже). Есть несколько областей подозрительности, которые у меня есть на данный момент, но я хотел бы получить новую перспективу. Вот некоторая дополнительная контекстная информация, которая может или не может быть полезным:
- Я использую прерывание для квадратурного энкодера
times[]
массив имеет типаunsigned long
alts[]
массива типаfloat
n
являетсяconst int
, в этом случаеn = 9
на ATmega328
double
такой же, какfloat
.. Arduino-doublefloat velF() { // uses the last n data points, fits a line to them, // and uses the slope of that line as the velocity at that moment float sumTY = 0, sumT = 0, sumY = 0, sumT2 = 0; for (int i = 0; i < n; i++) { sumTY += (float)times[i] * alts[i]/1000; sumT += (float)times[i]/1000; sumY += alts[i]; sumT2 += (float)times[i] * times[i]/1000000; } return (n*sumTY - sumT*sumY)/(n*sumT2 - sumT*sumT); }
Любая помощь или совет будет весьма признателен!
У вас есть подразделение. Вы проверили знаменатель на ноль? –
Когда OP говорит * «Иногда я запускаю высотомер, и эта функция вернет значение« inf », перемежающееся с кучей других неправильных значений» * вы говорите о интерфейсе альтиметра? –
Вот еще информация, которая может помочь: http://forum.arduino.cc/index.php?topic=46912.0 http://en.cppreference.com/w/cpp/language/operator_arithmetic –