2014-09-15 5 views
0

Я пишу алгоритм для получения суммы числа точек с плавающей запятой, и этот алгоритм отлично работает для целого числа, но когда я применяю к точкам с плавающей точкой, сумма, которую я получил, является отрицательным числом. однако мой массив точек с плавающей точкой имеет только положительное число точек с плавающей точкой. здесь я отправляю свой код, спасибо за его проверку.Сумма числа точек с плавающей точкой

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 отлично работает с целыми числами, извлекающими мин массива). еще раз спасибо.

+1

Является 'make_heap()' при условии стандартной библиотеки или вашей собственной реализации? – timrau

+1

Что делает 'make_heap'? Изменяет ли массив? Если он не изменяет массив, вы должны называть его каждой итерацией? –

+0

'ary [j-1] = ary [j];' Кажется, вы получаете доступ за пределы эффективного диапазона. – BLUEPIXY

ответ

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] затем настроить кучу в следующем цикле, это намного дешевле.

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; 
} 
Смежные вопросы