Standard internațional pentru reprezentarea numerelor cu puncte plutitoare în computere

Practic orice limbaj de programare face posibilă utilizarea numerelor fracționate în calcule. Când vine vorba de implementarea software-ului de metode numerice sau de orice alte calcule de calculator, o problemă importantă este reprezentarea internă a numerelor cu care programatorul trebuie să funcționeze. Acest lucru depinde în mare măsură de precizia calculelor, precum și de viteza acestora.







Numere cu puncte în virgulă

Numerele cu puncte în virgulă sunt o formă comună de reprezentare a numerelor reale într-un computer. Parametrii principali ai acestei forme de reprezentare sunt baza gradului (baza) și precizia (precizia). În acest caz, este întotdeauna necesar ca baza gradului să fie un număr întreg întreg. Dacă u, atunci numărul 0.1 este reprezentat în formă. Cu toate acestea, este evident că pentru anumiți parametri unele cifre nu pot fi reprezentate cu precizie. De exemplu, cu și același număr 0.1 este reprezentat aproximativ în formă (deoarece în reprezentarea binară numărul 0.1 are o formă infinită).

În cazul general, având în vedere parametrii, înregistrarea de tip reprezintă numărul

Aceasta se numește mantisa unui număr și constă în poziții. În cele ce urmează, sub un număr în virgulă mobilă, numim numere reale care pot fi reprezentate cu precizie în sensul formularului dat.

Există doi parametri importanți - exponenții maximi și minime ai gradului $ "/> și" />. Astfel, pentru parametrii fixați, putem reprezenta -e_ + 1 \ right) \ beta ^ p $ "/> de numere diferite cu semnul în minte.

Să introducem încă un aranjament. Până în prezent, reprezentarea numerelor în virgulă mobilă nu este unică. De exemplu, cu și numărul 0.1 poate fi reprezentat ca și. Reprezentarea unui număr în cea mai înaltă poziție a cărei cifră este diferită de zero va fi numită normalizată. Folosirea formularelor normalizate rezolvă problema non-unicității reprezentării numerelor cu puncte în virgulă mobilă. (Cu toate acestea, printr-un astfel de aranjament, apare o întrebare interesantă - cum să reprezinte 0?)

Masina Epsilon

După cum știți, există două tipuri de erori de calcul - absolute și relative (Erori de calcul). Prin eroare relativă se înțelege raportul

unde este valoarea obținută la rotunjire și este valoarea exactă a calculelor.

Imaginați-vă că rotunjirea unui număr real este un număr. Cel mai rău caz de rotunjire corespunde erorii absolute, egală cu, unde. În mantisa rezultatului de rotunjire a pozițiilor. în mantisa poziției absolute de eroare.

Când încercați să scrieți o inegalitate pentru eroarea relativă corespunzătoare erorii absolute de mai sus, este ușor să obțineți acest lucru

Valoarea „/> numită mașină Epsilon (mașină de epsilon). Astfel, se poate argumenta că, atunci când rotunjire număr fracționar cel mai apropiat la acesta o eroare de rotunjire relativă float nu depășește epsilon mașinii.

Există o altă definiție. Epsilonul mașinii poate fi definit ca un număr minim pozitiv, care, atunci când este adăugat la unul, dă un rezultat diferit de unitate. Cititorului i se cere să verifice în mod independent echivalența acestor definiții.

Standardul IEEE

Există două standarde IEEE diferite pentru numerele în virgulă mobilă. IEEE 754 este un standard binar și necesită o singură precizie și dublă precizie. De asemenea, în standardul IEEE 754, utilizarea bitilor pentru reprezentarea numerelor în precizie unică și dublă este negociată cu acuratețe. În standard, IEEE 854 poate lua valoarea 10 sau 2. De asemenea, nu se spune nimic despre alocarea de biți între mantisă și grad.

Conceptul standardului IEEE este utilizat pentru a desemna proprietățile inerente ambelor standarde.

Fundația gradului

Alegerea clasei 10 ca bază nu necesită explicații speciale. Sistemul zecimal este un sistem familiar unei persoane. În cazul unui sistem binar, merită discutată unele dintre avantajele inerente. Am convenit să folosim forme normalizate de numere. Dacă în poziția cea mai înaltă există doar 1. Aceasta ne dă posibilitatea să nu stocăm această unitate în memorie și să obținem un pic suplimentar pentru mantisă. În acest caz, este obișnuit să spunem că standardul folosește un bit ascuns (bit ascuns).

Să ne întoarcem la întrebarea reprezentării lui zero în forma normalizată. Zero corespunde unei mantiste zero și o putere de -1 "/>. Astfel, zero este reprezentat în formă.

Precizia reprezentării

Standardul IEEE oferă 4 precizii diferite: single, double, single-extended și double-extended. IEEE 754 negocia greu numărul de biți de precizie unică și dublă. Aceasta înseamnă că pe toate computerele care suportă IEEE 754, numărul de biți din reprezentarea numerelor cu o singură precizie și cu dublă precizie este fixat. Numărul de biți de precizie extins nu este fixat ferm. Formatele extins sunt proiectate pentru a mări ușor numărul de biți pe mantisă și exponent. Mai jos este o tabelă cu parametri de precizie diferită în standardul IEEE.








Imaginați-vă că avem un program. La lucru, acest program încearcă să extragă o rădăcină de la -4. Dacă nu există valori redundante în standard și toate secvențele de biți ar exprima numerele corespunzătoare, atunci nu ar exista o ieșire mai bună decât oprirea programului cu un mesaj de eroare.

Pentru astfel de cazuri, în standardul IEEE există înțelesuri speciale.

NaN (nu este un număr) este utilizat de standardul IEEE pentru a trata situații de tipul extragerii unei rădăcini de la un număr negativ.

Iată un mic tabel care prezintă cazurile de revenire pe NaN.

Operații care returnează NaN

Cazul în care apare NaN

Reprezentarea de biți a NaN nu specifică ce valoare ar trebui să aibă mantisa. Singura restricție este că nu ar trebui să fie zero. Acest fapt este folosit pentru a transfera anumite informații de sistem prin mantisă. Astfel, există multe semnificații diferite ale formei NaN - fiecare pentru propriul său caz.

Să presupunem că, de exemplu, calculam valoarea unei anumite expresii. Să presupunem că are nevoie de valoarea NaN. În acest caz, valoarea finală a expresiei este de asemenea NaN. Dacă se ia în considerare o expresie lungă, la calculul căruia apare o valoare NaN, atunci informațiile despre sistem din mantisă ar trebui să corespundă valorii NaN, care a apărut mai întâi. O excepție este, de exemplu, adăugarea a două NaN. În acest caz, mantisa va corespunde uneia dintre ele, nu neapărat a primei.

Iată un bun exemplu care demonstrează importanța acestui înțeles special. Să presupunem că avem un program care calculează zerourile unei funcții. Vrem să o implementăm astfel încât să nu necesite un interval de căutare ca argument de intrare. O astfel de implementare poate provoca o problemă - ce se întâmplă dacă programul încearcă să calculeze valoarea unei funcții în afara domeniului definiției sale? În special, programul poate încerca să ia rădăcina pătrată de -4. Dacă programul a produs un mesaj de eroare și și-a încetat activitatea, ar fi inutil pentru noi. Existența NaN ne oferă posibilitatea de a ne întoarce ca urmare a preluării unei rădăcini pătrate și continuarea lucrului.

infinit

Infinitatea există pentru a rezolva situații precum depășirea și împărțirea la zero. La depășire, este posibil să se returneze numărul maxim reprezentabil cu un punct de plutire. Cu toate acestea, această decizie nu este întotdeauna justificată. Este mult mai profitabil să știm că a existat o depășire și să luăm măsurile corespunzătoare, după ce am primit acest rezultat. Există un infinit pozitiv și negativ. La primire, există o modalitate de a determina motivul în care a apărut o eroare - din cauza depășirii sau a divizării prin zero. Aceste informații sunt disponibile în stegulețele de stare.

Aritmetica folosind intuitiv este clară: atunci când se împarte valoarea finală cu rezultatul, va fi zero; Atunci când se adaugă sau se scade dintr-o valoare finită, rezultatul va fi fie respectiv.

Iată un mic exemplu de aritmetică infinită.

Să presupunem că lucrăm cu o funcție

Această înregistrare a funcției nu este foarte bună. Pentru sqrt \ beta ^ / 2> "/> sqrt \ beta ^ / 2>" /> depășirea va fi apelată în numitor și rezultatul va fi 0. Aceasta este incorectă, deoarece valoarea returnată trebuie să fie o valoare a comenzii. Rescriem formula într-o altă formă.

Această formulă nu va provoca depășiri atât de repede. La zero, va avea de asemenea o valoare corectă, deoarece "/> se va răsfoi cu zero.

Acest exemplu prezintă principalul avantaj al utilizării aritmeticii infinite: utilizarea de multe ori vă permite să ocoliți verificările numeroaselor cazuri extreme.

Zero cu un semn

Zero corespunde cu mantisa zero și cu exponentul -1 "/>, în funcție de valoarea bitului semn poate fi și .. Justificați introducerea acestor valori speciale.

În primul rând, să facem o notă interesantă: în standardul IEEE se stabilește că. Acest lucru se face astfel încât să nu existe nicio ambiguitate în cazul operatorilor condiționați ai formularului. Dar aceasta nu înseamnă că standardul nu face distincția între aceste două valori. Când se înmulțesc numerele prin zerouri cu semne sau atunci când se împart nivele cu semne prin numere, semnele sunt determinate în conformitate cu semnul obișnuit de aritmetică. De exemplu, și.

Să presupunem că zero nu are nici un semn. Apoi ar exista o incertitudine în calculul valorii expresiei. Incertitudinea este că ambele "/> și" /> ar lua valoarea 0. În același timp, ar fi nevoie de o valoare logică corectă. Cu alte cuvinte,

Având în vedere existența infinităților cu semne, singura soluție corectă la problema în cauză este introducerea de zerouri cu semne.

Să mai dăm un exemplu.

Luați în considerare funcția. Să presupunem că este un număr negativ foarte mic. Dacă au fost rotunjite la zero, atunci rezultatul ar fi, ceea ce, desigur, este greșit. Standardul IEEE nu are această problemă. În acest caz, valoarea NaN este rotunjită și returnată.

Numere anormale

Ultima semnificație specială a standardului IEEE este numărul neormalizat.

Să luăm în considerare un exemplu. Fie u = -98 „/> Numerele si - .. numere in virgula mobila, care diferă de numărul minim reprezentabile este mai mult de 10 de ori Aceste numere au o caracteristică interesantă a diferenței lor este zero, cu toate că ele nu sunt egale Acest lucru este .. deoarece zero rotunjit. am dori să ne familiare identitatea

a fost întotdeauna efectuată. Fără îndeplinirea acestei identități este destul de dificil să scriem programe care funcționează cu numere fracționate. Ar fi necesar să se includă în codul programului numeroase verificări și declarații condiționate.

Introducerea numerelor neormalizate rezolvă această problemă.

Esența este că pentru un exponent de putere egal cu "/> mantisa nu ar trebui să fie normalizată, așa că, pentru că u = -98" /> nu mai este un număr minim reprezentabil. este, de asemenea, un număr valabil în virgulă mobilă.

Accesați formatul în diferite compilatoare

În directorul de includere al directorului de instalare VC, există un hover "float.h" standard, care descrie parametrii de bază ai formatelor float, dublu și lung dublu. Există, de asemenea, un "limit.h" hider, care descrie o serie de funcții pentru lucrul cu valori speciale.

Compilator Borland C (3.1)

În același folder include include hider "float.h"

GCC compilator (3.4)

În directorul de instalare (usr / lib / gcc /.) Există toate aceleași fișiere include cu hidrați. Are un fișier numit "float.h".

Referințe







Trimiteți-le prietenilor: