C++ 四舍五入的平均水平越来越差
我试图用Arduino平均高度传感器的读数,但随着时间的推移,分辨率越来越差,尽管原始输入数据保持不变 此代码中未显式定义的所有变量都是floatC++ 四舍五入的平均水平越来越差,c++,arduino,arduino-c++,C++,Arduino,Arduino C++,我试图用Arduino平均高度传感器的读数,但随着时间的推移,分辨率越来越差,尽管原始输入数据保持不变 此代码中未显式定义的所有变量都是float altTotal = 0.00; slopeTotal = 0.00; altitude = ps.readFloatAltitudeMeters(); //=========== Altitude averaging for (int j = 0.00; j <=(aveNum-2); j++) { arrAlt[j] = arrAl
altTotal = 0.00;
slopeTotal = 0.00;
altitude = ps.readFloatAltitudeMeters();
//=========== Altitude averaging
for (int j = 0.00; j <=(aveNum-2); j++) {
arrAlt[j] = arrAlt[j+1];
}
arrAlt[aveNum-1] = altitude;
for (i = 0.00; i <= (aveNum-1); i++){
altTotal = altTotal + arrAlt[i];
}
altAve = altTotal/(i);
//============
f = f+1;
altRd = altRd + altAve;
if (f == 5) {
//======== check cycle time
unsigned long endCycle = micros();
unsigned long delta = endCycle - start;
delta = delta/1000;
unsigned long start = endCycle;
loop1 = loop2;
loop2 = delta;
loopTime = loop2-loop1;
//========
v0 = v1;
v1 = v2;
v2 = altRd/f - v0 - 2*v1;
altButt = v0 + 2*v1 + v2;
alt1 = alt2;
alt2 = altButt;
climbRate = (alt2 - alt1) * (1000/loopTime); //to convert climb rate to m/s
//climbRate = -5;
f = 0;
altRd = 0;
}
我不知道问题出在哪里
我将一些变量作为不同的类型,但我将它们全部转换为浮点数以尝试提高分辨率,但没有成功。鉴于上述示例,我无法告诉您错误的确切位置,但我可以告诉您是什么原因导致问题,以及如何解决问题 您的代码在数值上不稳定。真实值通过C++和大多数其他语言(有一个新的更精确的标准被引入,但它没有广泛使用)。
float
的值精度为23位,这意味着其精度约为其值的10^{-7}。下面的所有内容都将被截断
例如:2e7f+1==2e7f
为true
,因为给定的浮点精度太小
很可能在代码中的某个地方,两个越来越大的浮点变量之间存在差异,导致它们的差异随着时间的推移精度越来越低
要修复它,可以使用
double
而不是float
。如果你不能,或者这是不够的,那么你必须使你的代码在数值上更稳定。。。这可能很复杂。。。这不是一个简单的回答就能解释的问题。寻找关于这个问题的教程。所以我的代码在数值上确实不稳定。它的来源是大量的数字,许多小数最终只是在计算中被截断。我不能改变任何一个数字使它们变小,因为我需要使用整个范围。因此,我没有重新设计解决方案,而是应用了以下修复:
每分钟一次,我只需将导致问题的所有数字重置为零。我得到的小误差可以忽略不计,我的代码保持精确到三位小数(我测试了24小时,它工作得非常好)
谢谢你的帮助。你能出示一张支票吗?这有太多不相关的代码。请编辑问题以显示输出。我发布的代码是一个更大系统的一部分,这只是一个函数的一部分。我将看看我是否可以创建一个可复制的示例。分辨率的降低是随着时间的推移而发生的,以分钟为单位,而不是瞬间。太好了,非常感谢您的回答。我将尝试几件事,并就此问题进行汇报。
0.000,m/s ,0,0.10,328ms ,0.00m altRd ,1603.11m altButt
0.000,m/s ,0,0.10,328ms ,1603.12m altRd ,1603.11m altButt
0.000,m/s ,0,0.10,328ms ,3206.23m altRd ,1603.11m altButt
0.000,m/s ,0,0.10,328ms ,4809.35m altRd ,1603.11m altButt
0.000,m/s ,0,0.10,328ms ,6412.46m altRd ,1603.11m altButt
0.023,m/s ,0,0.10,328ms ,0.00m altRd ,1603.12m altButt
0.023,m/s ,0,0.10,328ms ,1603.12m altRd ,1603.12m altButt
0.023,m/s ,0,0.10,328ms ,3206.24m altRd ,1603.12m altButt
0.023,m/s ,0,0.10,328ms ,4809.37m altRd ,1603.12m altButt
0.023,m/s ,0,0.10,328ms ,6412.51m altRd ,1603.12m altButt
0.047,m/s ,0,0.10,328ms ,0.00m altRd ,1603.13m altButt
0.047,m/s ,0,0.10,328ms ,1603.14m altRd ,1603.13m altButt
0.047,m/s ,0,0.10,328ms ,3206.28m altRd ,1603.13m altButt
0.047,m/s ,0,0.10,328ms ,4809.42m altRd ,1603.13m altButt
0.047,m/s ,0,0.10,328ms ,6412.55m altRd ,1603.13m altButt