我写了一个算法来得到浮点数的总和,这个算法适用于整数但是当我应用于浮点时,我得到的总和是负数。但是我的浮点数组只有正浮点数。在这里我发布我的代码,谢谢你检查它。
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的整数完美配合)。 再次感谢。
答案 0 :(得分:0)
在您的代码中,您想要计算存储在double[]
中的堆的总和,因此make_heap
是多余的,一个简单的循环就足够了。
确保double
足以保存总和。
对于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;
}