多个浮点数的总和

时间:2014-09-15 01:11:00

标签: c algorithm floating-point sum

我写了一个算法来得到浮点数的总和,这个算法适用于整数但是当我应用于浮点时,我得到的总和是负数。但是我的浮点数组只有正浮点数。在这里我发布我的代码,谢谢你检查它。

static unsigned int do_heap_sum(double ary[], unsigned int n,
                double *result)
{
    unsigned int j;
    int counter=0;
    double sum=0;
    double min;
    while(n>counter){
          make_heap(ary,n);
          min=ary[0];
          sum=sum+min;

          for(j=1;j<n;j++){
              ary[j-1]=ary[j];
          }
          counter=counter+1;
     }   

    *result=sum;
    //exit(EXIT_FAILURE);
    return 0;
}

在这段代码中,我使用make_heap来查找min。你觉得这有问题吗? (这个make_heap与提取数组min的整数完美配合)。 再次感谢。

2 个答案:

答案 0 :(得分:0)

  1. 在您的代码中,您想要计算存储在double[]中的堆的总和,因此make_heap是多余的,一个简单的循环就足够了。

  2. 确保double足以保存总和。

  3. 对于ary[j-1] = ary[j]中的for(j=1;j<n;j++),为什么不交换ary[0]ary[n - counter - 1]然后在下一个循环中调整堆,它便宜得多。

答案 1 :(得分:0)

我的猜测是你使用了整数版本的make_heap:

void make_heap(int *ary,size_t n);

而不是双精度浮点版本:

void make_double_heap(double *ary,size_t n);

否则,我注意到你排序了一堆大小n,n次:这太多了。当ary的某些元素重复时会发生什么?

你可以重写循环:

static unsigned int do_heap_sum(double ary[], unsigned int n,
            double *result)
{
    unsigned int counter=0;
    double sum=0;
    double min;
    while(n>counter){
          make_double_heap(ary+counter,n-counter);
          min=ary[counter];
          sum=sum+min;
          counter=counter+1;
     }   

    *result=sum;
    return 0;
}