5 Събиране на голям брой числа

Събиране на голям набор от числа, които се различават значително по големина

2 Тривиален метод на сумиране

3 Подредено сумиране

4 Сумиране по двойки

5 Метод на сумиране на Коен

6 препратки

Събирането вероятно е първата операция, която се научавате да извършвате, когато изучавате математика, но може да е една от последните операции, които се научавате да изпълнявате надеждно на компютър.

Проблемът с изчисляването на сумата на голям набор от числа с плаваща запетая често възниква в практически приложения. Най-простите примери са числено интегриране и изчисляване на средната стойност. Въпреки това, колкото и тривиална да изглежда тази задача на пръв поглед, тя не е лесна, ако искаме надеждно да изчислим сумата.

По-долу ще приемем, че числата, чиято сума трябва да се намери, се съхраняват в масива flt_arr. Дължината на масива ARR_SIZE е доста голямо число.

Метод на тривиално сумиране

Първо, нека да разгледаме най-простия метод за изчисляване на сумата от числа с плаваща запетая.

float f_add (float * flt_arr)

for (i = 0; i Числата в компютъра са представени приблизително, което се дължи на ограничеността на битовата решетка (вижтеМеждународен стандарт за представяне на числа с плаваща запетая в компютри). Да приемем, че редът на мантисата не ни позволява да различаваме цифри от порядъка на 10 милиарда. Искаме да добавим числата:

1,0 + 1,0e10 + −1,0e10

Като сумираме числата в различен ред, получаваме различен резултат:

(1,0 + 1,0e10) + -1,0e10

1,0 + (1,0e10 + −1,0e10)

В първия случай информацията за първия термин беше напълно загубена, тъй като другите дватермините са много по-големи. При сумиране на малък брой членове грешката може да не се забележи, но при сумиране на голям набор от числа с плаваща запетая грешката ще се натрупа поради тези малки грешки, а също и поради разликата между междинната сума и текущия член.

Може да се препоръча добавяне на числа с по-голяма точност. Ако, например, е необходимо да добавите числа от типа float, тогава е по-добре да представите резултата като двоен тип, подобно на първоначалния двоен, по-добре е да използвате long double.

/* Метод с разширена точност */

float fx_add (float * flt_arr)

Тази функция постига пълна предвидимост на последователността от елементи.

По-долу е даден алгоритъм, който обработва масив в цикъл - при всяка итерация числата се сумират по двойки, докато размерът на масива се намалява наполовина.

float fp_add (float * flt_arr)

плаваща сума [ARR_SIZE / 2 + 1];

връщане flt_arr[0] + flt_arr[1];

иначе ако (ARR_SIZE == 1)

за (i = j = 0; i 2)

Калкулатор

Услуга за безплатна оценка на цената на работата

  1. Попълнете заявление. Експертите ще изчислят цената на вашата работа
  2. Изчисляването на цената ще дойде по пощата и SMS

Номерът на вашето приложение

Точно сега по пощата ще бъде изпратено автоматично писмо за потвърждение с информация за приложението.