运行时平均值不精确

时间:2019-01-05 08:49:55

标签: c average precision

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

<span class="recent_number"></span>
<ul id="side-recent-area" class="side-recent-area">
    <li class="q_basket_area xans-record-">
        <div class="q_basket_details displaynone">
            <h3 class="q-heading -size-xs">
                <a href="/show/board.html##param##">product</a>
            </h3>
            <ul class="q_basket_info">
                <li class="q_basket_name">
                    <a href="#;" class="displaynone">(eng : )</a>
                </li>
            </ul>
        </div>
    </li>
    <li class="q_basket_area xans-record-">
        <div class="q_basket_details displaynone">
            <h3 class="q-heading -size-xs">
                <a href="/show/board.html##param##">product</a>
            </h3>
            <ul class="q_basket_info">
                <li class="q_basket_name">
                    <a href="#;" class="displaynone">(eng : )</a>
                </li>
            </ul>
        </div>
    </li>
    <li class="q_basket_area xans-record-">
        <div class="q_basket_details displaynone">
            <h3 class="q-heading -size-xs">
                <a href="/show/board.html##param##">product</a>
            </h3>
            <ul class="q_basket_info">
                <li class="q_basket_name">
                    <a href="#;" class="displaynone">(eng : )</a>
                </li>
            </ul>
        </div>
    </li>
    <li class="q_basket_area displaynone xans-record-">
        <div class="q_basket_details displaynone">
            <h3 class="q-heading -size-xs">
                <a href="/show/board.html##param##">product</a>
            </h3>
            <ul class="q_basket_info">
                <li class="q_basket_name">
                    <a href="#;" class="displaynone">(eng : )</a>
                </li>
            </ul>
        </div>
    </li>
    <li class="q_basket_area displaynone xans-record-">
        <div class="q_basket_details displaynone">
            <h3 class="q-heading -size-xs">
                <a href="/show/board.html##param##">product</a>
            </h3>
            <ul class="q_basket_info">
                <li class="q_basket_name">
                    <a href="#;" class="displaynone">(eng : )</a>
                </li>
            </ul>
        </div>
    </li>
</ul>

虽然我得到了答案,但这是一个问题,但这不是精确的答案。

接受的输出:accuracy difference shown in the image

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

2 个答案:

答案 0 :(得分:0)

这里

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

您正在尝试访问绑定数组元素之外的内容,这肯定会导致未定义的行为,因为假设n5,那么您正在访问arr[5]也不存在。

C不执行数组边界条件检查,它的程序员负责不要访问超出范围的元素,否则会导致UB。

C中,数组索引从0开始,而不是从1开始。因此最好开始将循环从0旋转到n。对于例如

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

答案 1 :(得分:0)

由于使用float而不是double,因此代码无法达到所需的精度。 @Some programmer dude

典型的float精确到2 23 中的1个部分。要打印到0.0000000001,最好使用typically precise到2 53 中1个部分的double

#include<stdio.h>

int main(void) {
  //float arr[n + 1], resarr[n + 1];
  //float sum = 0;
  double arr[n + 1], resarr[n + 1];
  double sum = 0;
  ...

    // scanf("%f", &arr[i]);
    scanf("%lf", &arr[i]);

    ...
    // float res = sum / (float) i;
    double res = sum / i;  // cast not needed as `sum` is `double`
  ...
}

从1开始迭代在C语言中不是惯用的。更常见的是从0开始进行迭代。

size_t最适合数组大小调整和索引编制。 int可能太窄。当然,对于较小的数组,它的作用很小。

#include<stdio.h>

int main(void) {
  printf("set:");
  size_t n;
  scanf("%zu", &n);
  double arr[n], resarr[n];
  double sum = 0;

  for (size_t i = 0; i < n; i++) {
    scanf("%lf", &arr[i]);
    sum = arr[i] + sum;

    double res = sum / (i+1);
    resarr[i] = res;
  }

  for (size_t i = 0; i < n; i++) {
    printf("%0.10f\n", resarr[i]);
  }

  return 0;
}

更健壮的代码将检查用户输入是否有效,如果允许n较大,则分配而不使用VLA,在读取之前刷新输出,等等。

请注意,不需要数组arr[],只需输入一个doublesum