首页 > 解决方案 > 运行时不精确的平均值

问题描述

我正在尝试解决一个问题,但遇到了一些问题。
我必须找到一系列数字的运行平均值。
例子:

input 4 2 7 
output 4 3 4.3333

现在这是问题,虽然我得到了答案,但这不是准确的答案。

接受的输出:图像中显示的精度差异

 290.6666666667
 385.4000000000
 487.8333333333
 477.4285714286
 496.4444444444
 ...
 523.8571166992
 506.0454406738
 495.3043518066

我找不到什么问题。一些帮助将不胜感激。

#include<stdio.h>

main(){
  int n;
  printf("set:");
  scanf("%d",&n);
  float arr[n+1],resarr[n+1];
  float sum=0;

  for(int i=1; i<=n; i++){
    scanf("%f",&arr[i]);
    sum=arr[i]+sum;

    float res= sum/(float)i;
    resarr[i]=res;
  }
  int i=1;
  while(i<=n) {
    printf("%0.10f\n",resarr[i]);
    i++;
  }

  return 0;
}

标签: caverageprecision

解决方案


这里

for(int i=1; i<=n; i++){ }

您正在尝试访问超出范围的数组元素,这肯定会导致未定义的行为,因为让我们假设如果n是,5那么您正在访问的arr[5]也是不存在的。

C不执行数组边界条件检查,它的程序员有责任不访问越界元素,否则会导致 UB。

C数组中索引0不是从1. 0所以最好从到开始旋转循环n。例如

for(int i=0; i<n; i++) { 
   scanf("%f",&arr[i]);
   /* some code */
}

推荐阅读