do while循环判断测量值稳定时异常提前跳出问题求助
问题根因与修复方案
- 核心故障是while条件的逻辑运算符使用错误:你当前写的
&&逻辑要求两个差值mess.x2 - mess.Acal[mess.j][0] >= 0.000001和mess.Acal[mess.j][0] - mess.x2 >=0.000001同时成立,这两个表达式互为相反数,不可能同时大于等于正数0.000001,所以while条件永远为假,do-while循环只会执行一次就直接跳出,和你两次采样的实际差值没有任何关系。 - 正确的写法有两种可选:
- 把逻辑与
&&改成逻辑或||,只要任意一个差值大于等于阈值,就说明两次采样差超过阈值,需要继续循环:
do { mess.Acal[mess.j][0] = analoginput(); HAL_Delay(100); mess.x2 = analoginput(); } while (mess.x2 - mess.Acal[mess.j][0] >= 0.000001 || mess.Acal[mess.j][0] - mess.x2 >=0.000001 );- 更简洁直观的写法,调用
fabs()函数求两次采样差值的绝对值再和阈值比较:
#include <math.h> // 需引入math头文件使用fabs函数 do { mess.Acal[mess.j][0] = analoginput(); HAL_Delay(100); mess.x2 = analoginput(); } while (fabs(mess.x2 - mess.Acal[mess.j][0]) >= 0.000001); - 把逻辑与
- 关于你提到的极小数值运算精度问题:你当前用到的1e-6阈值远高于double类型的最小精度范围,这个场景下不存在减法运算的精度误差问题,故障完全是逻辑写法错误导致的。
内容的提问来源于stack exchange,提问作者Marc Hammer
相关产品推荐
相关产品推荐

