gpt4 book ai didi

c++ - 舍入平均值逐渐变差

转载 作者:行者123 更新时间:2023-11-28 04:08:08 25 4
gpt4 key购买 nike

我试图用 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;

}

我希望“climbRate”的输出具有一致的分辨率,但随着时间的推移,分辨率变得更差,是二的倍数。首先它以 0.006 的分辨率开始,然后是 0.012,然后是 0.023,然后是 0.047,然后是 0.094 等等。

这是一个输出示例:

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

我不确定问题出在哪里。

我有一些不同类型的变量,但我将它们全部变成 float 以尝试提高分辨率但没有成功。

最佳答案

根据上面的示例,我无法告诉您错误的确切位置,但我可以告诉您导致问题的原因以及解决问题的方法。

您的代码在数值上不稳定。实际值通过 floating point 表示与大多数其他语言一样,在 C++ 中使用(引入了一个新的更准确的标准,但尚未广泛使用)。

float 具有 23 位的值精度,这意味着其精度约为其值的 10^{-7}。下面的所有内容都被截断了。

例如:2e7f + 1 == 2e7ftrue 因为给定的浮点精度 1 太小了。

很可能在您的代码中的某个地方,您取了两个越来越大的浮点变量的差值,导致它们的差值随着时间的推移准确性越来越低。

要修复它,您可以使用 double 而不是 float。如果你不能,或者它还不够,那么你必须让你的代码在数值上更稳定......它可能很复杂......这不是一个简短的答案可以轻易解释的东西。寻求有关该问题的教程。

关于c++ - 舍入平均值逐渐变差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58348168/

25 4 0
文章推荐: c++ - 如何将 PUT curl 映射到 CPP Curlpp?
文章推荐: c++ - 如何将编译器标志从 clang 传递给 nvcc
文章推荐: html - Chrome 和 Opera 占位符
文章推荐: javascript - 使用 Javascript 定位
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com