【发布时间】:2016-06-03 18:42:16
【问题描述】:
我有一个需要一些建议的功能(如下所示)。该函数返回拟合(通过最小二乘法)到 n 个数据点的直线的斜率。为了给你一个背景,我的项目是一个基于气压的高度计,它使用这个函数根据最近的 n 个高度-时间对来确定速度。这些高度-时间对存储在 2 个全局数组中(times[] 和 alts[])。
我的问题不是这种方法不起作用。它通常会。但有时我会运行高度计,这个函数会返回值'inf',其中穿插着一堆其他错误值(我也见过'NaN',但这种情况更罕见)。在这一点上,我有几个方面的怀疑,但我想要一个新的视角。以下是一些可能有用也可能没用的更多上下文信息:
- 我正在为正交编码器使用中断
-
times[]数组的类型为unsigned long -
alts[]数组的类型为float -
n是const int,在本例中为n = 9 -
在 ATMEGA328 上,
double与float..Arduino-double 相同float 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' 并穿插着一堆其他错误值” 你在说高度计吗界面?
-
@Ben Stringer 我不认为你理解:插入一些代码来查看分母 是 是零还是接近零,以消除你对它的假设“应该”。如果失败,那么问题出在其他地方,或者算法不正确。所以转储数组内容并在发生时检查它们。
-
如果除法产生
inf,那么只有四种可能:(1)被除数是inf; (2) 除数为0; (3) 编译器产生了不正确的代码; (4) 硬件损坏。最后两个不太可能。第一个似乎与代码不一致。这留下了一个零除数作为最可能的解释。
标签: arduino floating-point least-squares divide-by-zero