User:ZI1214
Аритметичке операције плутајућих тачака
[edit]Ради лакшег приказивања и разумевања, у примерима ће се користити децимални радик са прецизношћу од 7 цифара, као у ИЕЕЕ 754 децимал32 формату. Основни принципи су исти у било ком радику или прецизности, осим што је нормализација необавезна (не утиче на нумеричку вредност резултата). Овде, С означава значење и Е означава експонента.
Сабирање и одузимање
[edit]Једноставна метода за додавање бројева са плутајућим тачкама је да их прво представите истом експонентом. У следећем примеру, други број се помера десно три цифре, а онда се наставља са уобичајеним методом додавања:
123456.7 = 1.234567 × 10 ^ 5
101.7654 = 1.017654 × 10 ^ 2 = 0.001017654 × 10 ^ 5
Стога:
123456.7 + 101.7654 = (1.234567 × 10 ^ 5) + (1.017654 × 10 ^ 2)
= (1,234567 × 10 ^ 5) + (0,001017654 × 10 ^ 5)
= (1.234567 + 0.001017654) × 10 ^ 5
= 1.235584654 × 10 ^ 5
Детаљно:
е = 5; с = 1.234567 (123456.7)
+ е = 2; с = 1.017654 (101.7654)
е = 5; с = 1.234567
+ е = 5; с = 0.001017654 (након промене)
--------------------
е = 5; с = 1.235584654 (труе сум: 123558.4654)
Ово је прави резултат, тачан збир операнди. Она ће бити заокружена на седам цифара, а затим се нормализовати ако је потребно. Коначни резултат је
е = 5; с = 1.235585 (коначна сума: 123558.5)
Имајте на уму да су најниже три цифре другог операнда (654) у суштини изгубљене. Ово је заокружена грешка. У екстремним случајевима, збир два не-нулта броја може бити једнак једном од њих:
е = 5; с = 1.234567
+ е = -3; с = 9.876543
е = 5; с = 1.234567
+ е = 5; с = 0.00000009876543 (након промене)
----------------------
е = 5; с = 1.23456709876543 (права сума)
е = 5; с = 1.234567 (после заокруживања и нормализације)
У горе наведеним концептуалним примјерима, чини се да би велики број екстра цифара требао бити обезбеђен од стране сабљача како би се осигурала исправна заокруживање; Међутим, за бинарно додавање или одузимање користећи пажљиве технике примене, п
отребно је извући само два додатна заштитна битова и један додатни лепљиви бит преко прецизности операнди [12].
Још један проблем губитка значаја се јавља када се одузму два скоро једнака броја. У следећем примеру е = 5; с = 1,234571 и е = 5; с = 1.234567 су репрезентације рационалних 123457.1467 и 123456.659.
е = 5; с = 1.234571
- е = 5; с = 1.234567
----------------
е = 5; с = 0.000004
е = -1; с = 4.000000 (после заокруживања и нормализације)
Најбоља представљеност ове разлике је е = -1; с = 4.877000, што се разликује од више од 20% од е = -1; с = 4.000000. У екстремним случајевима, све значајне цифре прецизности се могу изгубити (иако постепени прелив осигурава да резултат неће бити нула, осим ако два операнда нису једнака). Ово отказивање илуструје опасност у претпоставци да су све цифре израчунатог резултата значајне. Суочавање са последицама ових грешака је тема у нумеричкој анализи; погледајте и проблеме са тачностима.
Множење и дељење
[edit]Да се множе, значења се множе док се додају експоненти, а резултат је заокружен и нормализован.
е = 3; с = 4,734612
× е = 5; с = 5.417242
-----------------------
е = 8; с = 25.648538980104 (прави производ)
е = 8; с = 25.64854 (после заокруживања)
е = 9; с = 2.564854 (после нормализације)
Слично томе, поделу се остварује тако што се одштетни показатељ дивиденде одузима од експонента дивиденде и подели сигнификантан износ дивиденде по значају делитеља.
Не постоје проблеми са отказивањем или апсорпцијом са мултипликацијом или поделом, мада се мале грешке могу акумулирати док се операције извршавају узастопно. [12] У пракси, начин на који се ове операције спроводе у дигиталној логици могу бити прилично сложени (погледајте Бутов алгоритам множења и алгоритам дивизије). [Нб 2] За брзу и једноставну методу погледајте Хорнерову методу.
Суочавање са изузетним случајевима
[edit]Рачунање са плутајућим тачком на рачунару може се појавити у три врсте проблема:
Операција може бити математички недефинисана, као што је ∞ / ∞, или дељење нуле.
Операција може бити законска у принципу, али није подржана од стране специфичног формата, на пример, израчунавање квадратног корена од -1 или инверзног сине од 2 (обе оба резултирају комплексним бројевима).
Операција може бити законска у принципу, али резултат је немогуће представити у наведеном формату, јер је експонент превелики или премали за кодирање у поље експонента. Овакав догађај се назива прелив (експонент превелик), потоп (показатељ сувише мали) или денормализација (прецизан губитак).
Пре ИЕЕЕ стандарда, такви услови су обично довели до тога да се програм прекине или покрену неку врсту замке коју би програмер могао да ухвати. Како је ово функционисало зависи од система, што значи да програми са плутајућим тачкама нису преносиви. (Имајте на уму да је израз "изузетак" који се користи у ИЕЕЕ 754 општем термину који означава изузетно стање, што није нужно грешка, и представља другачију употребу за ону која је типично дефинисана у програмским језицима као што су Ц ++ или Јава, у којој "изузетак" је алтернативни ток контроле, ближе ономе што се назива "замка" у ИЕЕЕ 754 терминологији).
Овдје се разматра тражени метод подразумијевања изузетака у складу са ИЕЕЕ 754 (ИЕЕЕ 754 опционално траппинг и други режими за алтернативни изузетак). Аритметички изузеци су (по подразумеваној вредности) обавезни да се забележе у бајтове заставе статуса "стицки". Да су "лепљиви" значи да се не ресетују следећом (аритметичком) операцијом, али остану постављени док се не изричито ресетују. Употреба "лепљивих" застава на тај начин омогућава да се тестирање изузетних услова одложи док се након потпуног израза или подпрограма са плутајућом тачком: без њих изузетни услови који не би могли бити игнорисани на други начин, захтевају експлицитно тестирање одмах након сваке операције са покретном тачком. Подразумевано, операција увек враћа резултат према спецификацији без прекида рачунања. На примјер, 1/0 повратак + ∞, а такођер поставља битни број за поделу по нули (ово подразумијевано од ∞ је дизајнирано тако да често враћа коначан резултат када се користи у наредним операцијама и тако се сигурно игнорише).
Оригинални ИЕЕЕ 754 стандард, међутим, није препоручио операције за обраду таквих скупова бита за аритметичке изузетке. Дакле, иако су оне имплементиране у хардверу, иницијално имплементације програмског језика обично нису обезбедиле средства за приступ њима (осим асемблер-а). Временом су неки стандарди програмског језика (нпр., Ц99 / Ц11 и Фортран) ажурирани да би се одредиле методе за приступ и промјену бита заставе статуса. 2008 верзија стандарда ИЕЕЕ 754 сада одређује неколико операција за приступ и руковање битним вредностима за аритметичке ознаке. Модел за програмирање је заснован на једној нитној изведби и њиховом коришћењу помоћу више навоја мора се руководити средствима изван стандарда (нпр. Ц11 наводи да заставе имају локално складиштење навоја).
ИЕЕЕ 754 специфицира пет аритметичких изузетака који треба да се забележе у заставе статуса ("лепљиви битови"):
неисправно, подесите ако је заобљена (и враћена) вредност различита од математички тачног резултата операције.
подводно, подесите ако је заобљена вредност мала (као што је наведено у ИЕЕЕ 754) и неефикасно (или можда ограничено ако има губитак денормализације, у складу са верзијом ИЕЕЕ 754 из 1984. године), враћајући поднормалну вредност укључујући и нуле.
преливати, поставити ако је апсолутна вредност заокружене вредности превелика да би била представљена. Врати се бесконачност или максимална коначна вредност, у зависности од тога која се заокружује.
подијелити по нули, поставити ако је резултат бесконачан с обзиром на коначне операнде, враћајући бесконачност, било + ∞ или -∞.
неважећи, подесите ако се стварни резултат не може вратити, нпр. скрт (-1) или 0/0, враћа мирни НаН.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/45/%D0%9E%D1%82%D0%BF%D0%BE%D1%80%D0%BD%D0%B8%D1%86%D0%B8_%D1%83_%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%B5%D0%BB%D0%BD%D0%BE%D1%98_%D0%B2%D0%B5%D0%B7%D0%B8_%D1%81%D0%B0_%D1%83%D0%BA%D1%83%D0%BF%D0%BD%D0%BE%D0%BC_%D0%BE%D1%82%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D1%88%D1%9B%D1%83_Rtot.png/220px-%D0%9E%D1%82%D0%BF%D0%BE%D1%80%D0%BD%D0%B8%D1%86%D0%B8_%D1%83_%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%B5%D0%BB%D0%BD%D0%BE%D1%98_%D0%B2%D0%B5%D0%B7%D0%B8_%D1%81%D0%B0_%D1%83%D0%BA%D1%83%D0%BF%D0%BD%D0%BE%D0%BC_%D0%BE%D1%82%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D1%88%D1%9B%D1%83_Rtot.png)