Număr punct fix

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 14 iunie 2021; verificarea necesită 1 editare .

Fixed -point number ( în engleză  fixed-point number ) este un format pentru reprezentarea unui număr real în memoria computerului ca un întreg . Mai mult, numărul x însuși și reprezentarea sa întreagă x′ sunt legate prin formula

,

unde z  este prețul (greutatea) cifrei cel mai puțin semnificative.

În cazul în care , pentru comoditatea calculelor, se face submultiplu la unu, astfel încât numerele întregi să fie codificate fără eroare. Cu alte cuvinte, se alege un întreg  u ( unitatea mașinii ) și se ia . În cazul în care , se face întreg.

Dacă nu este necesar ca în grila de biți să fie incluse anumite numere fracționale, programatorii aleg de obicei - acest lucru permite utilizarea deplasărilor de biți în operațiunile de înmulțire și împărțire . Ei spun despre o astfel de aritmetică: „ f biți pe parte fracțională, i = n−f  - pe întreg” și sunt notați ca „ i , f ”, „ i . f " sau " Qi.f " (vezi formatul numeric Q ). De exemplu: aritmetica 8.24 atribuie 8 biți părții întregi și 24 părții fracționale. În consecință, este capabil să stocheze numere de la −128 la 128− z cu prețul (greutatea) cifrei celei mai puțin semnificative .

Pentru mărimile unghiulare, o fac adesea (mai ales dacă funcțiile trigonometrice sunt calculate dintr-un tabel).

Titlu

Denumirea „virgulă fixă” (sau „punct fix”; în continuare - FZ) provine dintr-o metaforă simplă: o virgulă este plasată între două cifre predeterminate pentru a transforma un întreg într-o fracție. De exemplu, întregul 1234, după inserarea unei virgule, devine fracțional 12,34.

În Marea Britanie, SUA și alte țări, un punct este folosit în loc de virgulă pentru a separa partea întreagă a unui număr de partea fracțională, astfel încât conceptele de „punct fix” și „virgulă fixă” sunt echivalente.

Aplicație

Aritmetica în virgulă fixă ​​este adesea folosită în zonele în care numerele în virgulă mobilă sunt scumpe sau imposibile din cauza arhitecturii procesorului utilizat. De exemplu, co-procesoarele video de la PlayStation ( Sony ), Saturn ( Sega ), Game Boy Advance ( Nintendo ), Nintendo DS , GP2X folosesc aritmetica cu virgulă fixă ​​pentru a crește randamentul pe arhitecturile non- FPU . Standardul OpenGL ES 1.x include suport pentru numere în virgulă fixă, deoarece este proiectat pentru sistemele încorporate , care adesea nu au un FPU .

În plus, aritmetica în virgulă fixă ​​este utilizată pentru a oferi suport minim pentru numerele fracționale pe un procesor întreg: microcontroler , telefon mobil , set- top boxe până la Playstation , etc. Dacă problemele incorecte și SLAE de ordin înalt nu sunt rezolvate, o soluție fixă punctul este adesea suficient - este important doar să alegeți un preț (greutate) potrivit cu cea mai mică cifră semnificativă pentru fiecare dintre cantități.

Numerele cu virgulă fixă ​​sunt utilizate acolo unde nu este necesară o precizie ridicată, dar este necesară performanță. În majoritatea procesoarelor moderne, FZ nu este implementat în hardware, dar chiar și software-ul FZ este foarte rapid - prin urmare, este folosit în diferite tipuri de motoare de joc, rasterizatoare [1] , etc. De exemplu, motorul Doom folosește Q16. 16 aritmetică pentru măsurarea distanțelor, pentru unghiuri - 360°=2 32 .

De asemenea, este convenabil să folosiți o virgulă fixă ​​pentru a scrie numere care, prin natura lor, au o eroare absolută constantă : coordonate în programele de layout , marcaje temporale , sume monetare . De exemplu, atât modificarea într-un supermarket, cât și taxele dintr-o țară sunt calculate la cea mai apropiată sutime. Fișierele cu valorile fonturilor TeX utilizează tipul semnat cu virgulă fixă ​​de 32 de biți Q12.20, biblioteca de rasterizare a fonturilor FreeType  utilizează Q26.6 [2] . O virgulă mobilă cu un număr suficient de semne mantise poate fi folosită și pentru valori similare - dar apoi câmpul de comandă devine redundant. În plus, punctul fix se comportă absolut previzibil - atunci când numărați banii, acest lucru vă permite să configurați diferite tipuri de rotunjire , iar în jocuri - cel mai simplu mod de a implementa modul multiplayer și de a înregistra reluări.

Dezavantaje

Dezavantajul unui punct fix este o gamă foarte îngustă de numere, cu amenințarea de depășire la un capăt al intervalului și pierderea preciziei la celălalt. În calculele complexe, trebuie să vă încadrați constant în acest interval folosind redimensionarea - folosind diferite formate de punct fix pentru timp, poziție, viteză ... Această problemă a condus la inventarea virgulei mobile . De exemplu: dacă aveți nevoie de 3 cifre semnificative de precizie, un punct fix de 4 octeți oferă o gamă de 6 ordine de mărime (adică o diferență de aproximativ 10 6 între cel mai mare și cel mai mic număr), un singur cod de 4 octeți. numărul de precizie dă  70 de ordine de mărime.

Implementări

Puține limbaje de programare oferă suport încorporat pentru numere în virgulă fixă, deoarece pentru majoritatea aplicațiilor reprezentarea binară sau zecimală a numerelor în virgulă mobilă este mai simplă și rezonabil de precisă. Numerele cu virgulă mobilă sunt mai simple datorită intervalului lor dinamic mai mare și nu necesită prespecificarea numărului de zecimale. Dacă este necesară aritmetica în virgulă fixă, aceasta poate fi implementată de programator în limbajul pe care îl folosește.

Numerele în virgulă fixă ​​în format BCD sunt adesea folosite pentru a stoca valori monetare - inexactitățile din formatele cu virgulă mobilă sunt inacceptabile, iar pentru microcontrolerele simple ale terminalelor de plată BCD, reprezentarea binară este de preferat. Din punct de vedere istoric, numerele cu virgulă fixă ​​au fost adesea folosite pentru tipurile de date zecimale, cum ar fi în PL/I și COBOL . Limbajul de programare Ada 2012 include suport încorporat pentru numere în virgulă fixă ​​(atât binare, cât și zecimale) și numere în virgulă mobilă. JOVIAL și Coral 66 au oferit ambele formate.

Standardul ISO/IEC TR 18037 adaugă suport pentru numere cu virgulă fixă ​​în limbajul C. Dezvoltatorii compilatorului GCC au implementat deja [3] acest suport.

Aproape toate limbajele DBMS și SQL acceptă aritmetica în virgulă fixă ​​și stocarea unor astfel de date. De exemplu, PostgreSQL are un tip numeric special pentru stocarea numerelor de până la 1000 de cifre exact.

Operațiuni

Dacă operanzii și rezultatul au o valoare (pondere) diferită a cifrei cel mai puțin semnificative, formulele sunt mai complicate - dar uneori acest lucru trebuie făcut din cauza diferenței mari de ordin de mărime.

Pentru a converti numerele dintr-un format cu virgulă fixă ​​într-un format care poate fi citit de om și invers, se aplică regulile obișnuite pentru conversia numerelor fracționale dintr-un sistem de numere pozițional în altul.

Note

  1. Numerele cu punct fix. Aplicație în grafica computerizată
  2. VI. Contururi FreeType . Preluat: 23 martie 2020.
  3. Numere cu punct fix . Documentația GCC