如何在C语言中计算等权重累积平均值?是否为移动平均?
问题解答
一、是否属于移动平均的说明
这种从首个样本开始到请求时刻的累积等权重平均值不是移动平均(moving average)。移动平均的核心是基于滑动窗口或固定数量的最新样本计算(比如取最近10个样本的平均值),新样本到来时会丢弃旧样本;而你描述的计算方式保留所有历史样本,计算的是全局累积平均,二者逻辑完全不同。
二、C语言实现方案
通过维护两个静态变量就能高效实现,避免每次请求时重新遍历所有样本:
sum:存储所有样本的累加和count:存储样本的总数量
每次新样本到来时更新这两个变量,请求平均值时直接用总和除以样本数即可。
代码示例
#include <stdio.h> // 静态变量仅在当前文件内可见,用于维护累积统计数据 static double sum = 0.0; static unsigned int count = 0; // 新增样本的函数 void add_sample(double sample) { sum += sample; count++; } // 获取累积平均值的函数 double get_cumulative_average() { if (count == 0) { printf("Error: No samples available.\n"); return 0.0; // 无样本时返回默认值,可按需调整 } return sum / count; } // 测试示例 int main() { add_sample(10.0); add_sample(20.0); add_sample(30.0); printf("Cumulative average: %.2f\n", get_cumulative_average()); // 输出20.00 add_sample(40.0); printf("Cumulative average after new sample: %.2f\n", get_cumulative_average()); // 输出25.00 return 0; }
注意事项
- 若样本数量极大,
sum可能出现精度溢出,可根据样本数值范围选择long double等更合适的数据类型。 - 若需线程安全,要为
add_sample和get_cumulative_average添加互斥锁(比如使用pthread_mutex_t)。
内容的提问来源于stack exchange,提问作者ga as
相关产品推荐
相关产品推荐

