【发布时间】:2011-05-27 20:22:03
【问题描述】:
我正在尝试计算滚动平均值,并尝试获取和优化一点,我已经简化了计算,因此只有一个除法。当该值减小时,存在当前值降低到小于平均值的点。在这一点上,平均值跳跃。我想这是因为除法是无符号的,而我的分子的符号位被解释为一个巨大的无符号数。我只是不确定我需要在哪里投射 unsigned 以确保这个问题不会再次出现。
unsigned int AverageUsage;
unsigned int TotalUsage;
unsigned int incCount;
AverageUsage = (TotalUsage - AverageUsage)/++incCount + AverageUsage;
AverageUsage 将始终为正,但当 TotalUsage 低于 AverageUsage 时,我不确定该部门会发生什么
AverageUsage = (signed int)(TotalUsage - AverageUsage)/++incCount + AverageUsage;
将分子设置为有符号,但我不确定如何进行除法。
AverageUsage = (signed int)((signed int)(TotalUsage - AverageUsage)/++incCount) + AverageUsage;
应该可以(我可以保证这个完整操作的结果永远不会是负数),但我担心 incCount 达到“看起来”为负数的值的情况。
是否有一个简单的解决方案,希望:
- 不需要 if 语句
- 不需要 QWORDs
谢谢!
【问题讨论】:
-
如果您包含所有这些变量的声明会有所帮助。 C 的提升规则取决于各种子表达式的类型。例如,AverageUsage 是 int 吗?无符号整数?无符号短?等
-
我怀疑这段代码;您确定这在算术上是正确的并且计算的是“滚动平均值”而不是“累积平均值”吗?滚动平均值需要“最近值”的缓冲区。
-
@Clifford。这是一个基本的 IIR。您可能正在考虑集成梳状 FIR;这相当于统计样本平均值(运行/滚动)。无论如何,它们都是正确的。作为低通滤波器和总体均值的近似值。