Закръгляне | Цифрова стойност означава да я замените с друга стойност, която е приблизително равна

Думата "закръгляне" за дадена числова стойност означава заместването ѝ с друга стойност, която е приблизително равна, но има по-кратка, по-проста или по-ясна форма. Например 23,74 USD може да се закръгли на 24 USD, дробта 312/937 може да се закръгли на 1/3, а изразът {\displaystyle {\sqrt {2}}} може да се закръгли на 1,41.

Закръглянето често се прави умишлено, за да се получи стойност, която е по-лесна за записване и обработка от първоначалната. Закръглянето може да се направи и за да се посочи точността на изчисленото число; например количество, което е изчислено като 123 456, но за което се знае, че е точно само в рамките на няколкостотин единици, е по-добре да се посочи като "около 123 500".

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

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

Закръглянето има много сходства с квантуването, което се случва, когато физическите величини трябва да бъдат кодирани чрез числа или цифрови сигнали.




 

Видове закръгляване

Типичните проблеми със закръгляването могат да включват:

  • Приближаване на ирационално число до дроб. Например, π по 22/7.
  • Приближаване на дроб с периодично десетично разширение до крайна десетична дроб. Например, 5/3 по 1,6667.
  • Замяна на рационално число с дроб с по-малък числител и знаменател. Например, 3122/9417 с 1/3.
  • Замяна на дробно десетично число с такова с по-малко цифри. Например, 2,1784 долара с 2,18 долара.
  • Замяна на цяло десетично число с цяло число с повече крайни нули. Например. 23,217 души с 23,200 души.
  • Замяна на стойност с кратна на определена сума. Например. 27,2 секунди по 30 секунди (кратно на 15).

 

Закръгляне до определена стъпка

Най-разпространеният вид закръгляне е закръглянето до цяло число или, по-общо, до цяло число, кратно на някаква стъпка - например закръгляне до цели десети от секундата, стотни от долара, до цели кратни на 1/2 или 1/8 инча, до цели десетки или хиляди и т.н.

В общия случай закръглянето на числото x до кратно на някаква определена стъпка m включва следните стъпки:

  1. Разделете x на m и нека резултатът е y;
  2. Закръглете y до целочислена стойност и я наречете q;
  3. Умножете q по m, за да получите закръглената стойност z.

{\displaystyle z=\mathrm {round} (x,m)=\mathrm {round} (x/m)\cdot m\,}

Например закръглянето на x = 2,1784 долара до цели центове (т.е. до кратно на 0,01) води до изчисляване на y = x/m = 2,1784/0,01 = 217,84, след това закръгляне на y до цялото число q = 218 и накрая изчисляване на z = q×m = 218×0,01 = 2,18.

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

Прирастът m обикновено е крайна дроб в цифровата система, която се използва за представяне на числата. За да се покаже на хората, това обикновено означава десетичната бройна система (т.е. m е цяло число, умножено по степен на 10, например 1/1000 или 25/100). За междинни стойности, съхранявани в цифрови компютри, това често означава двоичната бройна система (m е цяло число, умножено по степен 2).

Абстрактната едноаргументна функция "round()", която връща цяло число от произволна реална стойност, има поне дузина конкретни дефиниции, представени в раздела за закръгляне до цяло число. Абстрактната двуаргументна функция "round()" е формално дефинирана тук, но в много случаи тя се използва с подразбиращата се стойност m = 1 за увеличението и след това се свежда до еквивалентната абстрактна едноаргументна функция, която също има същите десетина различни конкретни дефиниции.


 

Закръгляне до цяло число

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

Съществуват много начини за закръгляне на едно число y до цяло число q. Най-често срещаните са

  • Закръглете надолу (или вземете дъното, или закръглете към минус безкрайност): q е най-голямото цяло число, което не надвишава y.

{\displaystyle q=\mathrm {floor} (y)=\left\lfloor y\right\rfloor =-\left\lceil -y\right\rceil \,}

  • Закръглете нагоре (или вземете тавана, или закръглете към плюс безкрайност): q е най-малкото цяло число, което не е по-малко от y.

{\displaystyle q=\mathrm {ceil} (y)=\left\lceil y\right\rceil =-\left\lfloor -y\right\rfloor \,}

  • Закръгляне към нула (или съкращаване, или закръгляне от безкрайност): q е целочислената част на y, без дробните й цифри.

{\displaystyle q=\mathrm {truncate} (y)=\operatorname {sgn}(y)\left\lfloor \left|y\right|\right\rfloor =-\operatorname {sgn}(y)\left\lceil -\left|y\right|\right\rceil \,}

  • Закръгляне от нула (или закръгляне към безкрайност): ако y е цяло число, q е y; в противен случай q е цялото число, което е най-близко до 0 и е такова, че y е между 0 и q.

{\displaystyle q=\operatorname {sgn}(y)\left\lceil \left|y\right|\right\rceil =-\operatorname {sgn}(y)\left\lfloor -\left|y\right|\right\rfloor \,}

  • Закръгляне към най-близкото: q е цялото число, което е най-близко до y. Понякога това се записва като {\displaystyle q=\lfloor y\rceil } (вижте по-долу правилата за равенство).

Първите четири метода се наричат насочени закръглявания, тъй като всички премествания от първоначалното число y до закръглената стойност q са насочени към или от една и съща гранична стойност (0, +∞ или -∞).

Ако y е положително, закръглянето надолу е същото като закръглянето към нула, а закръглянето нагоре е същото като закръглянето от нула. Ако y е отрицателно, закръглянето надолу е същото като закръглянето далеч от нулата, а закръглянето нагоре е същото като закръглянето към нулата. Във всеки случай, ако y е цяло число, q е просто y. Следващата таблица илюстрира тези методи за закръгляване:

y

закръгляне
надолу
(към -∞)


обхождане
(към +∞)

закръгляне
към
нула

закръгляне
от
нула

закръгляне
до
най-близкото

+23.67

+23

+24

+23

+24

+24

+23.50

+23

+24

+23

+24

+23 или +24

+23.35

+23

+24

+23

+24

+23

+23.00

+23

+23

+23

+23

+23

0

0

0

0

0

0

-23.00

-23

-23

-23

-23

-23

-23.35

-24

-23

-23

-24

-23

-23.50

-24

-23

-23

-24

-23 или -24

-23.67

-24

-23

-23

-24

-24

Когато много изчисления се извършват последователно, изборът на метод за закръгляване може да окаже много голямо влияние върху резултата. Известен е примерът с нов индекс, създаден от фондовата борса във Ванкувър през 1982 г. Първоначално той е бил определен на 1000 000 и след 22 месеца е спаднал до около 520, докато цените на акциите като цяло са се увеличили през този период. Проблемът се дължеше на това, че индексът се преизчисляваше хиляди пъти дневно и винаги се закръгляше до 3 знака след десетичната запетая, така че грешките от закръгляването се натрупваха. Преизчисляването с по-добро закръгляне даде стойност на индекса от 1098,892 в края на същия период.


 

Прекъсване на равенството

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

Кръгла половина нагоре

Следното правило за равенство, наречено "закръгляне наполовина нагоре" (или "закръгляне наполовина към плюс безкрайност"), се използва широко в много дисциплини. Това означава, че половинчатите стойности y винаги се закръглят нагоре.

  • Ако частта от y е точно 0,5, тогава q = y + 0,5.

{\displaystyle q=\left\lfloor y+0.5\right\rfloor =-\left\lceil -y-0.5\right\rceil \,}

Например по това правило стойността 23,5 се закръгля на 24, а -23,5 се закръгля на -23.

Това е едно от двете правила, които обикновено се преподават в началните класове по математика в САЩ.

Ако не бяха дробните числа от 0,5, грешките при закръгляне, които се допускат чрез метода на закръгляне до най-близкото, щяха да бъдат доста симетрични: за всяка дроб, която се закръгля нагоре (например 0,268), има допълнителна дроб (а именно 0,732), която се закръгля надолу със същата стойност. При закръгляне на голям набор от числа със случайни дробни части тези грешки в закръгляването ще се компенсират статистически и очакваната (средна) стойност на закръглените числа ще бъде равна на очакваната стойност на първоначалните числа.

Правилото за закръгляне наполовина нагоре при равенство обаче не е симетрично, тъй като дробта, която е точно 0,5, винаги се закръгля нагоре. Тази асиметрия води до положително отклонение в грешките при закръгляне. Например, ако дробта y се състои от три случайни десетични цифри, то очакваната стойност на q ще бъде с 0,0005 по-висока от очакваната стойност на y. Поради тази причина закръглянето до най-близката точка с правилото за закръгляне наполовина нагоре е известно също (нееднозначно) като асиметрично закръгляне.

Една от причините за закръгляне на 0,5 е, че е необходимо да се провери само една цифра. Например, когато виждате 17.50000..., първите три цифри, 17.5, определят, че цифрата ще бъде закръглена на 18. Ако се използва обратното правило (закръгляне наполовина надолу), тогава ще трябва да се проверят всички нули след десетичната запетая, за да се определи дали стойността е точно 17,5.

Кръгът е наполовина надолу

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

  • Ако частта от y е точно 0,5, тогава q = y - 0,5.

{\displaystyle q=\left\lceil y-0.5\right\rceil =-\left\lfloor -y+0.5\right\rfloor \,}

Например 23,5 се закръгля на 23, а -23,5 се закръгля на -24.

Правилото за закръгляне наполовина надолу при равенство не е симетрично, тъй като дробните числа, които са точно 0,5, винаги се закръглят надолу. Тази асиметрия води до отрицателно отклонение в грешките при закръгляне. Например, ако дробта y се състои от три произволни десетични цифри, то очакваната стойност на q ще бъде с 0,0005 по-ниска от очакваната стойност на y. Поради тази причина закръглянето до най-близката точка с правилото за закръгляне наполовина надолу е известно също (нееднозначно) като асиметрично закръгляне.

Кръгла половина от нулата

Другият често преподаван и използван метод за определяне на равенство е закръглянето на половината от нулата (или закръглянето на половината към безкрайността), а именно:

  • Ако частта от y е точно 0,5, тогава q = y + 0,5, ако y е положително, и q = y - 0,5, ако y е отрицателно.

{\displaystyle q=\operatorname {sgn}(y)\left\lfloor \left|y\right|+0.5\right\rfloor =-\operatorname {sgn}(y)\left\lceil -\left|y\right|-0.5\right\rceil \,}

Например 23,5 се закръгля на 24, а -23,5 се закръгля на -24.

Този метод третира симетрично положителните и отрицателните стойности и следователно не съдържа цялостно отклонение, ако първоначалните числа са положителни или отрицателни с еднаква вероятност. Въпреки това това правило все пак ще доведе до положително отклонение за положителните числа и до отрицателно отклонение за отрицателните.

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

Кръгла половина към нула

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

  • Ако частта от y е точно 0,5, тогава q = y - 0,5, ако y е положително, и q = y + 0,5, ако y е отрицателно.

{\displaystyle q=\operatorname {sgn}(y)\left\lceil \left|y\right|-0.5\right\rceil =-\operatorname {sgn}(y)\left\lfloor -\left|y\right|+0.5\right\rfloor \,}

Например 23,5 се закръгля на 23, а -23,5 се закръгля на -23.

Този метод също така третира симетрично положителните и отрицателните стойности и следователно не съдържа цялостно отклонение, ако първоначалните числа са положителни или отрицателни с еднаква вероятност. Въпреки това това правило все пак ще доведе до отрицателно отклонение за положителните числа и до положително отклонение за отрицателните.

Закръглете половината до четно число

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

  • Ако частта от y е 0,5, то q е четно цяло число, най-близко до y.

Така например +23,5 става +24, +22,5 става +22, -22,5 става -22, а -23,5 става -24.

Този метод също така третира симетрично положителните и отрицателните стойности и следователно не съдържа цялостно отклонение, ако първоначалните числа са положителни или отрицателни с еднаква вероятност. Освен това за повечето разумни разпределения на стойностите на y очакваната (средна) стойност на закръглените числа е по същество същата като тази на оригиналните числа, дори ако всички те са положителни (или отрицателни). Това правило обаче все пак ще доведе до положително отклонение за четните числа (включително нулата) и до отрицателно отклонение за нечетните.

Този вариант на метода "от кръга до най-близкия" се нарича още "безпристрастно закръгляне" (двусмислено и малко неправомерно), "конвергентно закръгляне", "статистическо закръгляне", "холандско закръгляне", "гаусово закръгляне" или "банкерско закръгляне". То се използва широко в счетоводството.

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

Закръглете половината до нечетно число

Друго правило за равенство, което е много сходно с това за закръгляне до равенство, а именно

  • Ако дробта на y е 0,5, то q е нечетното цяло число, което е най-близко до y.

Така например +22,5 става +23, +21,5 става +21, -21,5 става -21, а -22,5 става -23.

Този метод също така третира симетрично положителните и отрицателните стойности и следователно не съдържа цялостно отклонение, ако първоначалните числа са положителни или отрицателни с еднаква вероятност. Освен това за повечето разумни разпределения на стойностите на y очакваната (средна) стойност на закръглените числа е по същество същата като тази на оригиналните числа, дори ако всички те са положителни (или отрицателни). Това правило обаче все пак ще доведе до отрицателно отклонение за четните числа (включително нулата) и до положително отклонение за нечетните.

Този вариант почти никога не се използва в повечето изчисления, освен в ситуации, в които искаме да избегнем закръглянето на 0,5 или -0,5 до нула или да избегнем увеличаването на мащаба на числата, представени като числа с плаваща запетая (с ограничени диапазони за експонентата на закръгляне), така че число, което не е безкрайно, да се закръгли до безкрайност или малка денормална стойност да се закръгли до нормална ненулева стойност (това може да се случи при режим на закръгляне от половината до четно). Ефективно този режим предпочита запазването на съществуващата скала на числата за равенство, като избягва резултати извън обхвата, когато е възможно.

Стохастично закръгляне

Друг обективен метод за прекъсване на равенството е стохастичното закръгляне:

  • Ако дробната част на y е .5, изберете q на случаен принцип измежду y + 0,5 и y - 0,5 с еднаква вероятност.

Подобно на правилото за закръгление от половин до четна стойност, това правило по същество е свободно от цялостно отклонение, но също така е справедливо за четни и нечетни стойности на q. От друга страна, то въвежда случаен компонент в резултата; извършването на едно и също изчисление два пъти върху едни и същи данни може да даде два различни резултата. Освен това е възможно несъзнателно отклонение, ако хората (а не компютрите или случайните устройства) "случайно" решават в коя посока да се закръглят.

Редуващо се решаване на въпроси с равен брой гласове

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

  • Ако дробната част е 0,5, закръгляйте последователно нагоре и надолу: при първата поява на дробна част от 0,5 закръгляйте нагоре; при втората поява закръгляйте надолу и т.н. и т.н.

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


 

Обикновено размиване

В някои случаи всички горепосочени методи за закръгляване могат да се окажат незадоволителни. Например да предположим, че y е точно измерване на аудиосигнал, който се закръгля до цяло число q, за да се намалят разходите за съхранение или предаване. Ако y се променя бавно с времето, всеки от горепосочените методи за закръгляване ще доведе до това, че q ще бъде напълно константно за дълги интервали, разделени от внезапни скокове от ±1. Когато сигналът q се възпроизвежда, тези стъпки ще се чуват като много неприятен шум и всички вариации на оригиналния сигнал между две цели стойности ще бъдат напълно изгубени.

Един от начините за избягване на този проблем е всяка стойност y да се закръгля нагоре с вероятност, равна на нейната част, и да се закръгля надолу с допълнението към тази вероятност. Например числото 23,17 ще бъде закръглено нагоре до 24 с вероятност 0,17, а надолу до 23 с вероятност 1 - 0,17 = 0,83. (Това е еквивалентно на закръгляне надолу на y + s, където s е случайно число, равномерно разпределено между 0 и 1.) С това специално закръгляне, известно като dithering, внезапните стъпки се заменят с по-малко забележим шум и дори малките вариации в оригиналния сигнал ще се запазят до известна степен. Подобно на стохастичния подход за прекъсване на равенството, закръглянето не е предубедено: ако всички стойности на дробта са еднакво вероятни, закръглянето нагоре с определена стойност е толкова вероятно, колкото и закръглянето надолу със същата стойност; същото важи и за сумата от няколко закръглени числа. От друга страна, разбъркването внася случаен компонент в резултата, който е много по-голям от този при стохастичното определяне на равен брой точки.

По-точно, грешката при закръгляне за всяко дитерцирано число ще бъде равномерно разпределена случайна величина със средна стойност нула, но със стандартно отклонение {\displaystyle 1/{\sqrt {12}}\approx 0.2886}, което е по-добро от стандартното отклонение от 1/2 при простите прогнозни методи, но малко по-високо от това при по-простия стохастичен метод. Въпреки това сумата от n закръглени числа ще бъде случайна величина с очаквана грешка нула, но със стандартно отклонение {\displaystyle {\sqrt {n}}/{\sqrt {12}}} (общият останал шум), което се отклонява полуквадратично и може да стане лесно забележимо, дори ако стандартното отклонение на грешката при закръгляване за всяка извадка е {\displaystyle 1/{\sqrt {12n}}} , което бавно се приближава полуквадратично до нула. Така че това случайно разпределение все още може да е твърде високо за някои приложения, които закръглят много данни.


 

Многоизмерно размиване

Този вариант на простия метод на дитеринг все още закръгля стойностите с вероятност, равна на тяхната част. Вместо обаче да се използва случайно разпределение за закръгляне на изолирани извадки, грешката при закръгляне, възникваща при всяка закръглена извадка, се сумира за следващите околни елементи за извадка или изчисление; след това тази натрупана стойност се добавя към стойността на тези следващи извадки или изчислени стойности за закръгляне, така че модифицираните стойности да отчитат тази разлика, като се използва прогнозен модел (като например закръгляне на Флойд-Щайнберг).

След това модифицираните стойности се закръглят с някой от горепосочените методи за закръгляване, като най-добри са стохастичните методи или методите за закръгляване: в последния случай сумата от n закръглени числа все още ще бъде случайна величина с очаквана грешка нула, но с отлично постоянно стандартно отклонение от {\displaystyle 1/{\sqrt {12}}}вместо да се отклонява полуквадратично при закръгляне на изолирани извадки; а общото средно отклонение на грешката при закръгляне за всяка закръглена извадка ще бъде {\displaystyle 1/(n{\sqrt {12}})} , което ще се сходи хиперболично към нула, по-бързо, отколкото при полухиперболичната сходимост при закръгляне на изолирани извадки.

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

Ефективното разпространяване на натрупаните грешки при закръгляне може да зависи от дискретното измерение на дискретизираните данни за закръгляне: при дискретизиране на двумерни изображения, включително цветни изображения (които добавят дискретното измерение на цветовите равнини), или тримерни видеоклипове (които добавят дискретно измерение на времето), или на полифонични аудио данни (използващи дискретни измерения на времето и канала), все пак може да е за предпочитане тази грешка да се разпространи в предпочитана посока или равномерно в няколко ортогонални измерения, като например вертикално спрямо. хоризонтално за двумерни изображения, или в паралелни цветни канали в една и съща позиция и/или времева марка, и в зависимост от други свойства на тези ортогонални дискретни измерения (според модела на възприятие). В тези случаи могат да се използват няколко акумулатора за грешки при закръгляне (поне един за всяко дискретно измерение) или вектор (или матрица) от акумулатори с (n-1)-измерения.

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


 

Закръгляне до прости дроби

В някои случаи е желателно да се закръгли дадено число x до "чиста" дроб - т.е. най-близката дроб z = m/n, числителят m и знаменателят n на която не надвишават даден максимум. Този проблем е доста различен от този за закръгляне на стойност до фиксиран брой десетични или двоични цифри или до кратно на дадена единица m. Този проблем е свързан с последователностите на Фарей, дървото на Стърн-Броко и продължените дроби.


 

Мащабно закръгляне

Този тип закръгляване, който се нарича още закръгляне в логаритмична скала, е вариант на закръглянето до определена стъпка, но със стъпка, която се променя в зависимост от мащаба и големината на резултата. Конкретно целта е да се ограничи броят на значещите цифри, като стойността се закръгля така, че незначещите цифри да отпаднат. Този тип закръгляне се среща имплицитно при числа, изчислени със стойности с плаваща запетая с ограничена точност (като типовете IEEE-754 float и double), но може да се използва по-общо за закръгляне на всякакви реални стойности с всякакъв положителен брой значещи цифри и всякаква строго положителна реална основа.

Например той може да се използва в инженерната графика за представяне на данни с логаритмична скала с променливи стъпки (например дължини на вълни, чиято основа не е задължително да е цяло число) или в статистическите данни за определяне на класове от реални стойности в рамките на интервали с експоненциално нарастваща ширина (но най-често се използва с целочислени основи като 10 или 2).

Този вид закръгляне се основава на логаритмична скала, определена от фиксиран ненулев реален коефициент на закръгляне s (в най-честите случаи този коефициент е s=1) и фиксирана положителна основа b>1 (не е задължително да е цяло число и най-често е различна от коефициента на закръгляне), както и фиксирано цяло число n>0 на значещите цифри в тази основа (което определя стойността на нарастването, което ще се използва за закръгляне, заедно с изчислената ефективна скала на закръгленото число).

Първоначалното число на аргумента (както и полученото закръглено число) първо се представя в експоненциален запис x = s-a-m-bc , като знакът s е +1 или -1, абсолютната мантиса a е ограничена до полуотворения положителен интервал [1/b,1), а експонентата c е произволно (положително или отрицателно) цяло число. При това представяне всички значещи цифри са в дробната част на абсолютната мантиса, чиято целочислена част винаги е нула.

Ако изходното число (или закръгленото число) е 0, абсолютната мантиса a е определена като 0, а експонентата c е фиксирана на произволна стойност (0 в повечето конвенции, но някои представяния с плаваща запетая не могат да използват нулева абсолютна мантиса, а запазват определена максимална отрицателна стойност за експонентата c, за да представят самото число 0), а знакът s може да бъде произволно избран между -1 и +1 (обикновено се задава +1 за обикновена нула или се задава същият знак като аргумента в закръглената стойност, ако представянето на числата позволява да се разграничават положителни и отрицателни нули, дори ако те в крайна сметка представляват една и съща числова стойност 0).

Еквивалентно може да се използва и скалирано експоненциално представяне като x = a-s-bc със знакова мантиса a, която е равна на нула или се намира в един от двата полуотворени интервала (-1,-1/b] и [+1/b,+1), и това ще бъде случаят в алгоритъма по-долу.

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

  1. ако x е равно на нула, просто върнете x; в противен случай:
  2. преобразува x в мащабирано експоненциално представяне със знакова мантиса:
    {\displaystyle x=a\cdot s\cdot b^{c}\,}
    1. нека x' е неизмерената стойност на x, като я разделите на коефициента на мащабиране s:
      {\displaystyle x'=x/s\,} ;
    2. нека мащабният експонент c е единица плюс логаритъма на абсолютната стойност на x', закръглен до цяло число (към минус безкрайност):
      {\displaystyle c=1+\left\lfloor \log _{b}\left|x'\right|\right\rfloor =1+\left\lfloor \log _{b}\left|x/s\right|\right\rfloor \,} ;
    3. нека знаковата мантиса a е произведението на x', разделено на b до степента c:
      {\displaystyle a=x'\cdot b^{-c}=x/s\cdot b^{-c}\,}
  3. изчисляване на закръглената стойност в това представяне:
    1. нека c' е първоначалният експонент на мащабиране c на x':
      {\displaystyle c'=c\,}
    2. нека m е нарастването за закръгляне на мантисата a според броя на значещите цифри, които трябва да се запазят:
      {\displaystyle m=b^{-n}\,}
    3. нека a' е знаковата мантиса a, закръглена според тази стъпка m и избрания режим на закръгляване:
      {\displaystyle a'=\mathrm {round} (a,m)=\mathrm {round} (x/s\cdot b^{n-c'})\cdot b^{-n}\,}
    4. ако абсолютната стойност на a' не е по-малка от b, тогава намалете n (умножете нарастването m по b), увеличете експонентата на мащабиране c', разделете знаковата мантиса a на b и започнете отново закръглянето на новата знакова мантиса a в a' със същата формула; тази стъпка може да се избегне само ако функцията abtract "round()" винаги закръгля a към 0 (т.е.т.е. когато е просто съкращаване), но е необходима, ако тя може да закръглява a към безкрайност, защото закръглената мантиса може да има по-висок експонент на мащабиране в този случай, оставяйки допълнителна цифра на точност.
  4. връща закръглената стойност:
    {\displaystyle y=\mathrm {scaledround} (x,s,b,n)=a'\cdot s\cdot b^{c'}=\mathrm {round} (x/s\cdot b^{n-c'})\cdot s\cdot b^{c'-n}\,} .

За абстрактната функция "round()" този тип закръгляне може да използва всеки един от режимите за закръгляне към цяло число, описани по-подробно в следващия раздел, но най-често това е режимът за закръгляне към най-близкото (с правила за прекъсване на равенството, също описани по-подробно по-долу).

Например:

  • скалираното закръгляне на 1,234 с коефициент на скалиране 1 в основа 10 и 3 значещи цифри (максимална относителна точност=1/1000), когато се използва който и да е режим на закръгляне към най-близкото, ще върне 1,23;
  • Подобно мащабно закръгляне на 1,236 ще върне 1,24;
  • Подобно мащабно закръгляне на 21.236 ще върне 21.2;
  • подобно мащабно закръгляне на 321.236 ще върне 321;
  • мащабираното закръгляне на 1,234 с коефициент на мащабиране 1 в основа 10 и 3 значещи цифри (максимална относителна точност=1/1000), когато се използва режимът на закръгляне надолу, ще върне 1,23;
  • Подобно мащабно закръгляне на 1,236 също ще върне 1,23;
  • мащабно закръгляне на {\displaystyle \scriptstyle 3\pi /7\;\approx \;6.8571\cdot \pi \cdot 2^{-4}} с коефициент на мащабиране {\displaystyle \scriptstyle \pi } в основа 2 и 3 значещи цифри (максимална относителна точност=1/8), когато се използва режимът на закръгляне надолу, ще се върне {\displaystyle \scriptstyle 6\cdot \pi \cdot 2^{-4}\;=\;3\pi /8} ;
  • подобно мащабно закръгляне на {\displaystyle \scriptstyle 5\pi /7\;\approx \;5.7143\cdot \pi \cdot 2^{-3}} ще върне {\displaystyle \scriptstyle 5\cdot \pi \cdot 2^{-3}\;=\;5\pi /8} ;
  • подобно мащабно закръгляне на {\displaystyle \scriptstyle \pi /7\;\approx \;4.5714\cdot \pi \cdot 2^{-5}} ще върне {\displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-5}\;=\;\pi /8} .
  • подобно мащабно закръгляне на {\displaystyle \scriptstyle \pi /8\;=\;4\cdot \pi \cdot 2^{-5}} също ще върне {\displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-5}\;=\;\pi /8} .
  • подобно мащабно закръгляне на {\displaystyle \scriptstyle \pi /15\;\approx \;4.2667\cdot \pi \cdot 2^{-6}} ще върне {\displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-6}\;=\;\pi /16}.

 

Закръглете до наличната стойност

Готовият дървен материал, хартията за писане, кондензаторите и много други продукти обикновено се продават само в няколко стандартни размера.

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

Когато набор от предпочитани стойности е равномерно разпределен по логаритмична скала, Изборът на най-близката предпочитана стойност до дадена стойност може да се разглежда като вид мащабно закръгляне. Такива "закръглени" стойности могат да се изчислят директно.


 

Закръгляне с плаваща запетая

В аритметиката с плаваща запетая закръгляването има за цел да превърне дадена стойност x в стойност z с определен брой значещи цифри. С други думи, z трябва да бъде кратно на числото m, което зависи от големината на z. Числото m е степен на основата (обикновено 2 или 10) на формата с плаваща запетая.

Освен тази подробност, всички разгледани по-горе варианти на закръгляване се отнасят и за закръгляването на числата с плаваща запетая. Алгоритъмът за такова закръгляне е представен в раздела "Мащабно закръгляне" по-горе, но с постоянен коефициент на мащабиране s=1 и целочислена база b>1.

За резултати, при които закръгленият резултат би се препълнил, резултатът за насочено закръгляне е или съответното знаково безкрайно число, или най-голямото представимо положително крайно число (или най-малкото представимо отрицателно крайно число, ако x е отрицателно), в зависимост от посоката на закръгляне. Резултатът от препълването в обичайния случай на закръгляне до четно число винаги е съответното безкрайно число.

Освен това, ако закръгленият резултат е недостатъчен, т.е. ако експонентата би надвишила най-ниската представима стойност на цяло число, ефективният резултат може да бъде или нула (евентуално знакова, ако представянето може да поддържа разграничение на знаците за нулите), или най-малкото представимо положително крайно число (или най-голямото представимо отрицателно крайно число, ако x е отрицателно), евентуално денормално положително или отрицателно число (ако мантисата съхранява всичките си значими цифри, в който случай най-значимата цифра все пак може да се съхрани на по-ниска позиция, като се зададат най-високите съхранени цифри на нула, и тази съхранена мантиса не изпуска най-значимата цифра, нещо, което е възможно, когато основата b=2, защото най-значимата цифра винаги е 1 в тази основа), в зависимост от посоката на закръгляне. Резултатът от недопълване в обичайния случай на закръгляне към четно число винаги е съответната нула.


 

Двойно закръгляне

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

Някои компютърни езици и стандартът IEEE 754-2008 предписват при прости изчисления резултатът да не се закръгля два пъти. Това е особен проблем при Java, тъй като тя е проектирана да се изпълнява еднакво на различни машини, като за да се постигне това с x87 с плаваща запетая, трябва да се използват специални програмни трикове. Езикът Java беше променен така, че да позволява различни резултати, когато разликата няма значение, и да изисква използването на квалификатора "strictfp", когато резултатите трябва да съответстват точно.


 

Точно изчисление със закръглена аритметика

Възможно е да се използва закръглена аритметика, за да се оцени точната стойност на функция с дискретна област и обхват. Например, ако знаем, че едно цяло число n е идеален квадрат, можем да изчислим квадратния му корен, като преобразуваме n в стойност с плаваща запетая x, изчислим приблизителния квадратен корен y от x с плаваща запетая и след това закръглим y до най-близкото цяло число q. Ако n не е твърде голямо, грешката при закръгляне на y с плаваща запетая ще бъде по-малка от 0,5, така че закръглената стойност q ще бъде точният квадратен корен от n. При най-модерните компютри този метод може да бъде много по-бърз от изчисляването на квадратния корен от n чрез алгоритъм с цяло число.


 

Дилемата на производителя на маси

Уилям Кахан въвежда термина "Дилема на производителя на таблици" за неизвестните разходи за закръгляне на трансцендентни функции:

"Никой не знае колко би струвало да се изчисли y^w правилно закръглено за всеки два аргумента с плаваща запетая, при които то не прелива/не прелива. Вместо това, реномираните математически библиотеки изчисляват елементарни трансцендентни функции най-често в рамките на малко повече от половин улп и почти винаги добре в рамките на един улп. Защо Y^W не може да бъде закръглена в рамките на половин ulp, както SQRT? Защото никой не знае колко изчисления ще струва това... Не съществува общ начин да се предвиди колко допълнителни цифри ще трябва да се пренесат, за да се изчисли даден трансцендентен израз и да се закръгли правилно до някакъв предварително зададен брой цифри. Дори фактът (ако е верен), че краен брой допълнителни цифри в крайна сметка ще са достатъчни, може да е дълбока теорема."

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

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

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

Възможно е да се създадат добре дефинирани изчислими числа, които никога няма да могат да бъдат правилно закръглени, независимо колко цифри са изчислени. Например, ако предположението на Голдбах е вярно, но недоказуемо, тогава е невъзможно правилно да се закръгли надолу 0,5 + 10-n , където n е първото четно число, по-голямо от 4, което не е сбор от две първични числа, или 0,5, ако няма такова число. Това обаче може да бъде приближено до дадена точност, дори ако предположението е недоказуемо.


 

История

Концепцията за закръгляване е много стара, може би дори по-стара от концепцията за деление. Някои древни глинени плочки, намерени в Месопотамия, съдържат таблици със закръглени стойности на реципрочни и квадратни корени в основа 60. Древни са и закръглените приближения на π, дължината на годината и дължината на месеца.

От 1940 г. насам методът Round-to-even се използва като стандарт ASTM (E-29). Произходът на термините "безпристрастно закръгляне" и "статистическо закръгляне" е доста разбираем. В четвъртото издание на "Вероятност и теория на грешките" от 1906 г. Робърт Симпсън Удуърд нарича това "правило на компютъра", посочвайки, че тогава то е било широко използвано от хората, които са изчислявали математически таблици. Статията на Чърчил Айзенхарт от 1947 г. "Ефекти от закръглянето или групирането на данни" (в Selected Techniques of Statistical Analysis, McGrawHill, 1947 г., Eisenhart, Hastay, and Wallis, editors) посочва, че тази практика вече е "добре установена" в анализа на данни.

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

До 80-те години на миналия век методът за закръгляване, използван в аритметиката на компютрите с плаваща запетая, обикновено се определяше от хардуера, беше слабо документиран, непоследователен и различен за всяка марка и модел компютър. Тази ситуация се промени, след като стандартът IEEE 754 за плаваща запетая беше приет от повечето производители на компютри. Стандартът позволява на потребителя да избира между няколко режима на закръгляване и във всеки случай определя точно как да бъдат закръглени резултатите. Тези характеристики направиха числените изчисления по-предсказуеми и независими от машината и направиха възможно ефективното и последователно прилагане на интервална аритметика.


 

Функции за закръгляване в езиците за програмиране

Повечето езици за програмиране предлагат функции или специален синтаксис за закръгляне на дробни числа по различни начини. Най-ранните езици за числа, като FORTRAN и C, предоставяха само един метод, обикновено съкращаване (към нула). Този метод по подразбиране можеше да бъде подразбиращ се в определени контексти, например при присвояване на дробно число на целочислена променлива или при използване на дробно число като индекс на масив. Други видове закръгляне трябваше да се програмират изрично; например закръглянето на положително число до най-близкото цяло число можеше да се реализира чрез добавяне на 0,5 и прекъсване.

През последните десетилетия обаче синтаксисът и/или стандартните библиотеки на повечето езици обикновено предоставят поне четирите основни функции за закръгляване (нагоре/нагоре, надолу/надолу, към най-близкия и към нула). Методът за равенство може да варира в зависимост от езика и версията и/или може да се избира от програмиста. Няколко езика следват примера на стандарта IEEE-754 за плаваща запетая и дефинират тези функции като приемащи аргумент float с двойна точност и връщащи резултат от същия тип, който след това може да бъде конвертиран в цяло число, ако е необходимо. Тъй като форматът на IEEE за двойна точност има 52 дробни бита, този подход може да предотврати нежелани препълвания в езици с 32-битови цели числа. Някои езици, като PHP, предоставят функции, които закръглят стойността до определен брой десетични цифри, например от 4321,5678 до 4321,57 или 4300. Освен това много езици предоставят функцията "printf" или подобна функция за форматиране на низ, която позволява да се преобразува дробно число в низ, закръглен до зададения от потребителя брой десетични знаци (точността). От друга страна, прекъсването (закръгляне до нула) все още е методът за закръгляне по подразбиране, използван от много езици, особено при деление на две цели числа.

От друга страна, CSS и SVG не дефинират конкретна максимална точност за числата и измерванията, които се третират и излагат в техния модел на обекта на документа и в интерфейса на езика за описание на интерфейса като низове, сякаш имат безкрайна точност, и не правят разлика между цели числа и стойности с плаваща запетая; въпреки това реализациите на тези езици обикновено преобразуват тези числа в двойна плаваща запетая IEEE-754, преди да изложат изчислените цифри с ограничена точност (особено в рамките на стандартните интерфейсни връзки на Javascript или ECMAScript).


 

Други стандарти за закръгляване

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

Наблюдения на времето в САЩ

В ръководство, издадено в средата на 1966 г., Федералната служба за метеорология на САЩ определя, че метеорологичните данни трябва да се закръглят до най-близкото кръгло число, като се прилага правилото за равенство "закръгляне наполовина нагоре". Например 1,5, закръглено до цяло число, трябва да стане 2, а -1,5 трябва да стане -1. Преди тази дата правилото за равенство беше "закръгляне наполовина от нулата".

Отрицателна нула в метеорологията

Някои метеоролози могат да напишат "-0", за да посочат температура между 0,0 и -0,5 градуса (изключително), която е закръглена до цяло число. Този запис се използва, когато отрицателният знак се счита за важен, независимо колко малка е величината; например при закръгляне на температурите в скалата на Целзий, където под нулата означава замръзване.


 

Свързани страници

 

Въпроси и отговори

Въпрос: Какво означава думата "закръгляне"?


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

В: Какъв е примерът за закръгляне?


О: Пример за закръгляне е закръглянето на 23,74 щатски долара на 24 щатски долара, закръглянето на дробта 312/937 на 1/3 и закръглянето на израза 2 {\displaystyle {\sqrt {2}} на 1,41.

В: Защо закръгляме числата?


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

В: Какви са някои потенциални проблеми при закръгляването?


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

Въпрос: Как е свързано закръгляването с квантуването?


О: Закръглянето има много сходства с квантуването, което се случва, когато физическите величини трябва да бъдат кодирани чрез числа или цифрови сигнали.

AlegsaOnline.com - 2020 / 2023 - License CC3