C程序返回-nan错误求助:滑动均值计算异常排查
滑动均值数组代码输出-nan问题排查
问题描述
现有一段C语言代码,意图接收整数数组,生成滑动均值数组:第i位的值为i之前最后n个元素的均值;若i<n,则为i之前所有已有元素的均值。例如n=3时,输入数组1 2 3 4 5 6,对应输出1 1.5 2 3 4 5。但使用gcc编译运行时,控制台连续输出10次-nan,本地及在线编译环境均出现该问题。
问题代码
#include <stdio.h> #include <stdlib.h> float * mobMean (int x[], int n, int nval) { int i, j, sum, num; float *means; if(means=malloc(sizeof(float) * nval)) { for(i=0; i<nval; i++) { sum=0; num=0; for(j=i; j>=0 && i-j>=n; j--) { sum+=x[j]; num++; } *(means+i)=(float)sum/num; } } else printf("e"); return means; } int main() { int a[10], i; float *b; for(i=0; i<10; i++) scanf("%d", &a[i]); b=mobMean(a,3,10); for(i=0; i<10; i++) printf("%f", *(b+i)); free(b); return 0; }
问题排查与修复
核心错误:内层循环条件逻辑完全颠倒
代码中内层循环的条件j>=0 && i-j>=n是错误的:
- 该条件要求当前元素索引i与j的差值大于等于n,这意味着j的取值范围是
j <= i-n,对于所有i < n的情况,i-n是负数,循环根本不会执行,导致sum=0且num=0,0/0的计算结果就是nan。 - 正确的逻辑应该是i与j的差值小于n,即
j>=0 && i-j <n,这样才能取到i之前最多n个元素(当i<n时,取所有已有元素;当i>=n时,取最近n个元素)。
修复后的内层循环代码
for(j=i; j>=0 && i-j <n; j--) { sum+=x[j]; num++; }
额外优化点
- 输出格式优化:原
printf("%f", *(b+i))无空格分隔,建议改为printf("%f ", *(b+i)),方便区分结果。 - 内存分配失败提示:原
printf("e")可改为更清晰的提示,比如printf("内存分配失败\n")。
修复后测试
输入1 2 3 4 5 6 7 8 9 10,n=3时,输出应为:1.000000 1.500000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000
内容的提问来源于stack exchange,提问作者Simone Licciardi
相关产品推荐
相关产品推荐

