【发布时间】:2021-11-14 12:06:46
【问题描述】:
我是 C 新手,我正在编写一个程序来计算一个小型数据集的“双通道”方差计算。我得到的值是完全错误的,我认为这是一个特定的 for 循环(如下),这是问题的根源。
float sum_v_f_double = 0.0;
for (int i = 0; i <= size_f; i++)
sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);
如果我只是尝试打印这个计算的值,它只会打印一次。
输入:
float sum_v_f_double = 0.0;
for (int i = 0; i <= size_f; i++)
sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);
printf("%f\n", sum_v_f_double);
输出:
672057216.000000
这显然是一个问题,表明它甚至没有迭代。我不知道为什么,因为我在它上面有一个语法完全相同的循环,它工作正常。完整程序如下:
#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};
/* single precision */
/* double pass */
float size_f = sizeof(arr_f)/sizeof(*arr_f);
float sum_f = 0.0;
for (int i = 0; i <= size_f; i++)
sum_f += arr_f[i-1];
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-1]-mean_f)*(arr_f[i-1]-mean_f);
printf("%f\n", sum_v_f_double);
float var_f_double = (1./(size_f-1.))*sum_v_f_double;
return 0;
}
【问题讨论】:
-
缩进与 C 编译器完全无关。使用
{}分隔块。 -
i <= size_f你可能指的是<而不是<= -
如果您想在
for循环中包含多个语句,则需要大括号。for(...) { /* as much code as you like */ }. -
哇!永远不要将索引/限制声明为浮点数。
-
另外,从 0 开始循环并访问
arr_f[i-1]是自找麻烦,因为索引 -1 处的元素不存在。