【问题标题】:Sum of multiple float points number多个浮点数的总和
【发布时间】:2014-09-15 01:10:59
【问题描述】:

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

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 来查找最小值。你觉得这有问题吗? (这个 make_heap 与提取数组最小值的整数完美配合)。 再次感谢。

【问题讨论】:

  • make_heap()是标准库提供的还是自己实现的?
  • make_heap 是做什么的?它会修改数组吗?如果不修改数组,是不是每次迭代都要调用它?
  • ary[j-1]=ary[j]; 看来您访问的范围超出了有效范围。
  • 数字有多大?你检查过你不是简单地溢出了吗?
  • 检查是否正确输出结果。例如,如果您使用 printf/sprintf 您是否将 %i,%d 更改为 %lf ?如果结果真的是负数,那么在 sum 和 step 的 + 操作中添加断点,直到结果变为负数,然后你会看到真正发生了什么

标签: c algorithm floating-point sum


【解决方案1】:
  1. 在你的代码中,你想计算存储在double[]中的堆的总和,所以make_heap是多余的,一个简单的循环就足够了。

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

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

【讨论】:

    【解决方案2】:

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

    void make_heap(int *ary,size_t n);
    

    而不是双精度浮点版本:

    void make_double_heap(double *ary,size_t 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 2012-11-05
      • 2020-06-13
      • 2012-08-29
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多