Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 四舍五入的平均水平越来越差_C++_Arduino_Arduino C++ - Fatal编程技术网

C++ 四舍五入的平均水平越来越差

C++ 四舍五入的平均水平越来越差,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

我试图用Arduino平均高度传感器的读数,但随着时间的推移,分辨率越来越差,尽管原始输入数据保持不变

此代码中未显式定义的所有变量都是float

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