В обчислювальній математиці алгоритм Кехена (також відомий, як компенсаційне підсумовування) — це алгоритм обчислення суми послідовності чисел з рухомою комою, який значно зменшує обчислювальну похибку у порівнянні з наївним підходом (простим послідовним підсумовуванням чисел з заокругленням результату на кожному кроці). Зменшення похибки досягається введенням додаткової змінної для збереження суми похибок.
Зокрема, наївне підсумовування n чисел в найгіршому випадку дає похибку, яка росте пропорційно n і при підсумовуванні випадкових чисел має середнє квадратичне відхилення, пропорційне до (помилки заокруглення викликані випадковим блуканням). При компенсаційному підсумовуванні навіть в найгіршому випадку похибка не залежить від n, тому велика кількість доданків може бути підсумована з похибкою, яка залежить тільки від точності числа з рухомою комою.
Авторство алгоритму приписують Вільяму Кехену.
Алгоритм
В псевдокоді алгоритм можна записати так:
function KahanSum(input) var sum = 0.0 var c = 0.0 // Сума похибок. for i = 1 to input.length do y = input[i] - c // Поки що все добре: c - нуль. t = sum + y // На жаль, sum велике, y мале, тому молодші розряди y втрачені. c = (t - sum) - y // (t - sum) відновлює старші розряди y; віднімання y відновлює -(молодші розряди y) sum = t // Алгебраїчно, c завжди повинно дорівнювати нулю. Будьте обережні, користуючись оптимізувальними компіляторами! // Під час наступної ітерації втрачені молодші розряди будуть заново додані до y. return sum
Приклад
В цьому прикладі будемо використовувати десяткову шестирозрядну арифметику з рухомою комою. Комп'ютери, як правило, використовують двійкову арифметику, але алгоритм, що ілюструється, від цього не змінюється. Нехай sum було присвоєно значення 10000.0, і наступні два значення input[i] рівні 3.14159 і 2.71828. Точний результат рівний 10005.85987, що заокруглюється до 10005.9. При простому підсумовуванні порядок кожного вхідного значення був би вирівняний з sum, і багато молодших розрядів були б втраченими (заокругленими або відкинутими). Перший результат після заокруглення був би 10003.1. Другий результат був би 10005.81828 до заокруглення і 10005.8 після, що не є правильним результатом.
При компенсаційному підсумовуванні ми б отримали правильний заокруглений результат — 10005.9.
Покладемо початкове значення c=0.
y = 3.14159 - 0 y = input[i] - c t = 10000.0 + 3.14159 = 10003.1 Багато розрядів втрачено! c = (10003.1 - 10000.0) - 3.14159 Це потрібно розраховувати так, як записано! = 3.10000 - 3.14159 Відновлена частина y, яка на увійшла в t, а не все вхідне y. = -.0415900 Завершуючі нулі показані тому, що це шестирозрядна арифметика. sum = 10003.1 Таким чином, не всі розряди з input[i] включені в sum.
Сума настільки велика, що зберігаються тільки старші розряди доданку. На щастя, на наступному кроці c зберігає похибку.
y = 2.71828 - (-.0415900) Враховується похибка з попереднього кроку. = 2.75987 Її порядок не сильно відрізняється від y. Більшість розрядів враховано. t = 10003.1 + 2.75987 Але тільки деякі розряди попадають в sum. = 10005.85987, Заокруглюється до 10005.9 c = (10005.9 - 10003.1) - 2.75987 Тут отримується те, що прийшло = 2.80000 - 2.75987 В даному випадку забагато. = .040130 Так чи інакше надлишок буде віднятий наступного разу. sum = 10005.9 Точний результат: 10005.85987, що коректно заокруглено до 6 знаків.
Таким чином, додавання відбувається з використанням двох змінних: sum зберігає суму, і c зберігає частину суми, яка не потрапила в sum на наступній ітерації.
Точність
Старанний аналіз похибок при компенсаційному підсумовуванні є необхідним для оцінки точності. Незважаючи на те, що він є більш точним, ніж наївне підсумовування, він все ще може давати великі відносні похибки для погано обумовлених сум.
Припустимо, що виникає потреба підсумувати значень для .
Точна сума (розрахована з нескінченною точністю):
.
З компенсаційним підсумовуванням вона набуває вигляду , де похибка обмежена виразом:
,
— машинний епсилон (наприклад, ε≈10−16 для чисел з рухомою комою подвійної точності).
Як правило, нас цікавить величина відносної похибки , яка обмежена виразом:
.
У виразі для оцінки відносної похибки дріб є числом обумовленості задачі підсумовування. По суті, число обумовленості виражає внутрішню чутливість задачі підсумовування до похибок, незалежно від способу розрахунку.
В мовах програмування
В принципі, достатньо агресивні оптимізувальні компілятори можуть перешкоджати реалізації алгоритму Кехена. Наприклад, якщо компілятор спрощує вирази у відповідності до правил асоціативності для дійсних чисел, він може «спростити» другий крок у послідовності t = sum + y; c = (t - sum) - y;
до ((sum + y) - sum) - y;
, а потім до c = 0;
, виключаючи компенсацію похибок. На практиці багато компіляторів не використовують правила асоціативності (які є лише наближеними в арифметиці чисел з рухомою комою) для оптимізації, за винятком явного використання опцій компілятора, які дозволяють «небезпечні» оптимізації, хоча компілятор дозволяє за замовчуванням оптимізації, які базуються на правилах асоціативності. Оригінальна K&R версія мови програмування C дозволяла компілятору змінювати порядок операндів у виразах з рухомою комою у відповідності до правил асоціативності, але наступний стандарт ANSI C заборонив зміну порядку операндів для того, щоб зробити мову програмування C краще пристосованою для розробки додатків, які використовують чисельні методи (і більш подібною до мови програмування Fortran, яка забороняла зміну порядку операндів), однак на практиці способи оптимізації залежать від опцій компіляторів.
В загальному, вбудовані функції для підсумовування в мовах програмування, як правило, не гарантують, що алгоритм частинного підсумовування буде використовувати хоча б алгоритм Кехена.
В іншому мовному розділі є повніша стаття Kahan summation algorithm(англ.). Ви можете допомогти, розширивши поточну статтю за допомогою з англійської.
|
Примітки
- Strictly, there exist other variants of compensated summation as well: see Higham, Nicholas (2002). Accuracy and Stability of Numerical Algorithms (2 ed). SIAM. с. 110—123.(англ.)
- Higham, Nicholas J. (1993), The accuracy of floating point summation, SIAM Journal on Scientific Computing, 14 (4): 783—799, doi:10.1137/0914050(англ.)
- Kahan, William (January 1965), Further remarks on reducing truncation errors, Communications of the ACM, 8 (1): 40, doi:10.1145/363707.363723(англ.)
- L. N. Trefethen and D. Bau, Numerical Linear Algebra (SIAM: Philadelphia, 1997).(англ.)
- Goldberg, David (March 1991), (PDF), , 23 (1): 5—48, doi:10.1145/103162.103163, архів оригіналу (PDF) за 12 грудня 2019, процитовано 15 липня 2015(англ.)
- GNU Compiler Collection manual, version 4.4.3: 3.10 Options That Control Optimization [ 3 березня 2016 у Wayback Machine.], -fassociative-math (Jan. 21, 2010).(англ.)
- Compaq Fortran User Manual for Tru64 UNIX and Linux Alpha Systems [ 7 червня 2011 у Wayback Machine.], section 5.9.7 Arithmetic Reordering Optimizations (retrieved March 2010).(англ.)
- Börje Lindh, Application Performance Optimization [ 2 червня 2010 у Wayback Machine.], Sun BluePrints OnLine (March 2002).(англ.)
- Eric Fleegal, "Microsoft Visual C++ Floating-Point Optimization [ 15 липня 2015 у Wayback Machine.]", Microsoft Visual Studio Technical Articles (June 2004).(англ.)
- Martyn J. Corden, "Consistency of floating-point results using the Intel compiler [ 15 липня 2015 у Wayback Machine.]," Intel technical report (Sep. 18, 2009).(англ.)
- Tom Macdonald, "C for Numerical Computing", Journal of Supercomputing vol. 5, pp. 31–48 (1991).(англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V obchislyuvalnij matematici algoritm Kehena takozh vidomij yak kompensacijne pidsumovuvannya ce algoritm obchislennya sumi poslidovnosti chisel z ruhomoyu komoyu yakij znachno zmenshuye obchislyuvalnu pohibku u porivnyanni z nayivnim pidhodom prostim poslidovnim pidsumovuvannyam chisel z zaokruglennyam rezultatu na kozhnomu kroci Zmenshennya pohibki dosyagayetsya vvedennyam dodatkovoyi zminnoyi dlya zberezhennya sumi pohibok Zokrema nayivne pidsumovuvannya n chisel v najgirshomu vipadku daye pohibku yaka roste proporcijno n i pri pidsumovuvanni vipadkovih chisel maye serednye kvadratichne vidhilennya proporcijne do n displaystyle sqrt n pomilki zaokruglennya viklikani vipadkovim blukannyam Pri kompensacijnomu pidsumovuvanni navit v najgirshomu vipadku pohibka ne zalezhit vid n tomu velika kilkist dodankiv mozhe buti pidsumovana z pohibkoyu yaka zalezhit tilki vid tochnosti chisla z ruhomoyu komoyu Avtorstvo algoritmu pripisuyut Vilyamu Kehenu AlgoritmV psevdokodi algoritm mozhna zapisati tak function KahanSum input var sum 0 0 var c 0 0 Suma pohibok for i 1 to input length do y input i c Poki sho vse dobre c nul t sum y Na zhal sum velike y male tomu molodshi rozryadi y vtracheni c t sum y t sum vidnovlyuye starshi rozryadi y vidnimannya y vidnovlyuye molodshi rozryadi y sum t Algebrayichno c zavzhdi povinno dorivnyuvati nulyu Budte oberezhni koristuyuchis optimizuvalnimi kompilyatorami Pid chas nastupnoyi iteraciyi vtracheni molodshi rozryadi budut zanovo dodani do y return sumPrikladV comu prikladi budemo vikoristovuvati desyatkovu shestirozryadnu arifmetiku z ruhomoyu komoyu Komp yuteri yak pravilo vikoristovuyut dvijkovu arifmetiku ale algoritm sho ilyustruyetsya vid cogo ne zminyuyetsya Nehaj sum bulo prisvoyeno znachennya 10000 0 i nastupni dva znachennya input i rivni 3 14159 i 2 71828 Tochnij rezultat rivnij 10005 85987 sho zaokruglyuyetsya do 10005 9 Pri prostomu pidsumovuvanni poryadok kozhnogo vhidnogo znachennya buv bi virivnyanij z sum i bagato molodshih rozryadiv buli b vtrachenimi zaokruglenimi abo vidkinutimi Pershij rezultat pislya zaokruglennya buv bi 10003 1 Drugij rezultat buv bi 10005 81828 do zaokruglennya i 10005 8 pislya sho ne ye pravilnim rezultatom Pri kompensacijnomu pidsumovuvanni mi b otrimali pravilnij zaokruglenij rezultat 10005 9 Poklademo pochatkove znachennya c 0 y 3 14159 0 y input i c t 10000 0 3 14159 10003 1 Bagato rozryadiv vtracheno c 10003 1 10000 0 3 14159 Ce potribno rozrahovuvati tak yak zapisano 3 10000 3 14159 Vidnovlena chastina y yaka na uvijshla v t a ne vse vhidne y 0415900 Zavershuyuchi nuli pokazani tomu sho ce shestirozryadna arifmetika sum 10003 1 Takim chinom ne vsi rozryadi z input i vklyucheni v sum Suma nastilki velika sho zberigayutsya tilki starshi rozryadi dodanku Na shastya na nastupnomu kroci c zberigaye pohibku y 2 71828 0415900 Vrahovuyetsya pohibka z poperednogo kroku 2 75987 Yiyi poryadok ne silno vidriznyayetsya vid y Bilshist rozryadiv vrahovano t 10003 1 2 75987 Ale tilki deyaki rozryadi popadayut v sum 10005 85987 Zaokruglyuyetsya do 10005 9 c 10005 9 10003 1 2 75987 Tut otrimuyetsya te sho prijshlo 2 80000 2 75987 V danomu vipadku zabagato 040130 Tak chi inakshe nadlishok bude vidnyatij nastupnogo razu sum 10005 9 Tochnij rezultat 10005 85987 sho korektno zaokrugleno do 6 znakiv Takim chinom dodavannya vidbuvayetsya z vikoristannyam dvoh zminnih sum zberigaye sumu i c zberigaye chastinu sumi yaka ne potrapila v sum na nastupnij iteraciyi TochnistStarannij analiz pohibok pri kompensacijnomu pidsumovuvanni ye neobhidnim dlya ocinki tochnosti Nezvazhayuchi na te sho vin ye bilsh tochnim nizh nayivne pidsumovuvannya vin vse she mozhe davati veliki vidnosni pohibki dlya pogano obumovlenih sum Pripustimo sho vinikaye potreba pidsumuvati n displaystyle n znachen x i displaystyle x i dlya i 1 2 n displaystyle i 1 2 ldots n Tochna suma rozrahovana z neskinchennoyu tochnistyu S n i 1 n x i displaystyle S n sum i 1 n x i Z kompensacijnim pidsumovuvannyam vona nabuvaye viglyadu S n E n displaystyle S n E n de pohibka E n displaystyle E n obmezhena virazom E n 2 e O n e 2 i 1 n x i displaystyle E n leqslant left 2 varepsilon O n varepsilon 2 right sum i 1 n x i e displaystyle varepsilon mashinnij epsilon napriklad e 10 16 dlya chisel z ruhomoyu komoyu podvijnoyi tochnosti Yak pravilo nas cikavit velichina vidnosnoyi pohibki E n S n displaystyle E n S n yaka obmezhena virazom E n S n 2 e O n e 2 i 1 n x i i 1 n x i displaystyle frac E n S n leqslant left 2 varepsilon O n varepsilon 2 right frac sum limits i 1 n x i left sum limits i 1 n x i right U virazi dlya ocinki vidnosnoyi pohibki drib x i x i displaystyle sum x i left sum x i right ye chislom obumovlenosti zadachi pidsumovuvannya Po suti chislo obumovlenosti virazhaye vnutrishnyu chutlivist zadachi pidsumovuvannya do pohibok nezalezhno vid sposobu rozrahunku V movah programuvannyaV principi dostatno agresivni optimizuvalni kompilyatori mozhut pereshkodzhati realizaciyi algoritmu Kehena Napriklad yaksho kompilyator sproshuye virazi u vidpovidnosti do pravil asociativnosti dlya dijsnih chisel vin mozhe sprostiti drugij krok u poslidovnosti t sum y c t sum y do sum y sum y a potim do c 0 viklyuchayuchi kompensaciyu pohibok Na praktici bagato kompilyatoriv ne vikoristovuyut pravila asociativnosti yaki ye lishe nablizhenimi v arifmetici chisel z ruhomoyu komoyu dlya optimizaciyi za vinyatkom yavnogo vikoristannya opcij kompilyatora yaki dozvolyayut nebezpechni optimizaciyi hocha kompilyator Intel C dozvolyaye za zamovchuvannyam optimizaciyi yaki bazuyutsya na pravilah asociativnosti Originalna K amp R versiya movi programuvannya C dozvolyala kompilyatoru zminyuvati poryadok operandiv u virazah z ruhomoyu komoyu u vidpovidnosti do pravil asociativnosti ale nastupnij standart ANSI C zaboroniv zminu poryadku operandiv dlya togo shob zrobiti movu programuvannya C krashe pristosovanoyu dlya rozrobki dodatkiv yaki vikoristovuyut chiselni metodi i bilsh podibnoyu do movi programuvannya Fortran yaka zaboronyala zminu poryadku operandiv odnak na praktici sposobi optimizaciyi zalezhat vid opcij kompilyatoriv V zagalnomu vbudovani funkciyi dlya pidsumovuvannya v movah programuvannya yak pravilo ne garantuyut sho algoritm chastinnogo pidsumovuvannya bude vikoristovuvati hocha b algoritm Kehena V inshomu movnomu rozdili ye povnisha stattya Kahan summation algorithm angl Vi mozhete dopomogti rozshirivshi potochnu stattyu za dopomogoyu perekladu z anglijskoyi Divitis avtoperekladenu versiyu statti z movi anglijska Perekladach povinen rozumiti sho vidpovidalnist za kincevij vmist statti u Vikipediyi nese same avtor redaguvan Onlajn pereklad nadayetsya lishe yak korisnij instrument pereglyadu vmistu zrozumiloyu movoyu Ne vikoristovujte nevichitanij i nevidkorigovanij mashinnij pereklad u stattyah ukrayinskoyi Vikipediyi Mashinnij pereklad Google ye korisnoyu vidpravnoyu tochkoyu dlya perekladu ale perekladacham neobhidno vipravlyati pomilki ta pidtverdzhuvati tochnist perekladu a ne prosto skopiyuvati mashinnij pereklad do ukrayinskoyi Vikipediyi Ne perekladajte tekst yakij vidayetsya nedostovirnim abo neyakisnim Yaksho mozhlivo perevirte tekst za posilannyami podanimi v inshomovnij statti Dokladni rekomendaciyi div Vikipediya Pereklad PrimitkiStrictly there exist other variants of compensated summation as well see Higham Nicholas 2002 Accuracy and Stability of Numerical Algorithms 2 ed SIAM s 110 123 angl Higham Nicholas J 1993 The accuracy of floating point summation SIAM Journal on Scientific Computing 14 4 783 799 doi 10 1137 0914050 angl Kahan William January 1965 Further remarks on reducing truncation errors Communications of the ACM 8 1 40 doi 10 1145 363707 363723 angl L N Trefethen and D Bau Numerical Linear Algebra SIAM Philadelphia 1997 angl Goldberg David March 1991 PDF 23 1 5 48 doi 10 1145 103162 103163 arhiv originalu PDF za 12 grudnya 2019 procitovano 15 lipnya 2015 angl GNU Compiler Collection manual version 4 4 3 3 10 Options That Control Optimization 3 bereznya 2016 u Wayback Machine fassociative math Jan 21 2010 angl Compaq Fortran User Manual for Tru64 UNIX and Linux Alpha Systems 7 chervnya 2011 u Wayback Machine section 5 9 7 Arithmetic Reordering Optimizations retrieved March 2010 angl Borje Lindh Application Performance Optimization 2 chervnya 2010 u Wayback Machine Sun BluePrints OnLine March 2002 angl Eric Fleegal Microsoft Visual C Floating Point Optimization 15 lipnya 2015 u Wayback Machine Microsoft Visual Studio Technical Articles June 2004 angl Martyn J Corden Consistency of floating point results using the Intel compiler 15 lipnya 2015 u Wayback Machine Intel technical report Sep 18 2009 angl Tom Macdonald C for Numerical Computing Journal of Supercomputing vol 5 pp 31 48 1991 angl