C语言for循环计算double-pass方差结果异常、循环未迭代问题求助
问题原因
for循环未添加花括号,仅紧随循环的第一条语句会被纳入循环体。你写的printf不在循环范围内,所以只会在循环全部结束后执行一次,自然只能看到一次输出。- 循环边界逻辑错误,触发数组越界访问。你的数组长度为5,合法下标范围是
0~4,但你设置的循环条件是i <= size_f(size_f值为5),循环会执行6次:- 当
i=0时,你访问了arr_f[i-1]即arr_f[-1],属于读取数组边界外的非法内存,会拿到未知的脏值 - 多出来的迭代加上脏值直接导致求和结果完全错误
- 当
- 数组长度不应该用
float类型存储,应该用整型(如int、size_t),浮点数用于循环判断存在精度异常的隐患。
修正后的代码
#include <stdlib.h> #include <math.h> #include <stdio.h> int main(void) { float arr_f[5] = {25924.12, 25924.15, 25923.98, 25924.19, 25923.89}; // 数组长度用int存储 int size_f = sizeof(arr_f)/sizeof(*arr_f); float sum_f = 0.0; // 循环边界改为i < size_f,同时修改数组下标为i,避免越界 for (int i = 0; i < size_f; i++) sum_f += arr_f[i]; float mean_f = sum_f/size_f; float sum_v_f_double = 0.0; for (int i = 0; i < size_f; i++) { sum_v_f_double += (arr_f[i]-mean_f)*(arr_f[i]-mean_f); // 加花括号后printf属于循环体,每次迭代都会打印 printf("%f\n", sum_v_f_double); } float var_f_double = (1./(size_f-1.))*sum_v_f_double; printf("计算得到的方差为:%f\n", var_f_double); return 0; }
内容的提问来源于stack exchange,提问作者lcleary
相关产品推荐
相关产品推荐

