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)
Калкулатор
Услуга за безплатна оценка на цената на работата
- Попълнете заявление. Експертите ще изчислят цената на вашата работа
- Изчисляването на цената ще дойде по пощата и SMS
Номерът на вашето приложение
Точно сега по пощата ще бъде изпратено автоматично писмо за потвърждение с информация за приложението.