Număr-punct fix

Calculele în dispozitivele noastre nu este întotdeauna (să-l puneți blând) sunt numere întregi, și de a folosi numere în virgulă mobilă (float sau double) - foarte multe resurse ca și nu întotdeauna corecte. Ce să fac?

Există mai multe opțiuni. De exemplu, este posibil să se utilizeze numerele scalate. Dacă doriți să măsoare volți, se poate imagina valoarea în milivolți. Astfel, vom primi și întregi și calcule exacte. În cazul în care nu suficient de milivolți, microvolți pot fi folosite, și așa mai departe.

Această abordare este adesea folosit în diferite CADah și sectorul financiar. De exemplu, în KiCad, distanțele sunt măsurate în nanometri și int'ah stocate (deci, dimensiunea maximă a bord drum. - 4 * 4 metri).

De multe ori valoarea prezentă la diferite scări, nu este deosebit de dorit (de exemplu, pe ecran pe care doriți să afișați partea întreagă și partea fracționară servește doar pentru a crește acuratețea calculelor), și atunci trebuie să folosim numărul de puncte fixe. Numărul de puncte fixe - acele numere întregi aceleași, dar, în mod convențional, o parte fracționară este alocat un anumit număr de biți. Să luăm, de exemplu, de la un număr întreg pe 32 de biți va face unele numere de puncte fixe:



După cum se poate observa, numărul de puncte fixe denumit qm.n, unde m - partea întreagă, iar n - fracționată. În cazul în care numărul trebuie să fie semnat, bitul de semn este selectat pentru a avea o parte întreagă. În semn indirect de absența unui bit în titlu. De exemplu:

Deci, cum se păstrează numărul de puncte fixe, vom fi în containere întregi de obicei, le puteți defini astfel:

Valorile maxime și minime

Orice număr este un valori maxime și minime. Valoarea maximă a numărului de puncte fixe - 2 ^ m-1 / (2 ^ n-1), și teren minim 1 / (2 ^ n-1). (Aici, ca și mai înainte, m - întreaga parte și n - fracționată)

exemple:
q16.16: numărul maxim: 65535.99998474. pas - 1.53e-5
q0.32: numărul maxim: 0.9999999997671. pas - 2.328e-10
q5.27: numărul maxim: 31.9999999925. pas - 7.45e-9

Conversia la un punct fix și înapoi

Pentru a converti un număr în virgulă flotantă în numărul de fix, trebuie doar să-l înmulțim cu 2 ^ n.

Aici, de exemplu, macro-uri ale acestei transformări:

Dacă conversia unui număr întreg, nu se poate multiplica, ci pur și simplu o schimbare, deoarece multiplicarea cu o putere de două - este că aceeași schimbare, dar versiunea cu multiplicare - mai general:


Pentru a converti, dacă nu ciudat, ne-am schimba numărul nostru înapoi.


Poate fi convertit într-un număr în virgulă flotantă:


Pentru o conversie număr de la o poziție la un alt punct fix, acesta trebuie să fie decalate cu diferența în numărul de biți fracționare:

Adunare, scădere, înmulțire,

Adunare și scădere, inclusiv punct fix este exact la fel ca și cea a numerelor întregi. Nu puteți defini macro-uri pentru acest

Dar pentru înmulțire și împărțire, avem nevoie de containere de două ori mai mare pentru a stoca rezultatul intermediar, pentru că prin înmulțirea 32 de biți 32 de biți 64 de biți se poate întâmpla:

Apropo, dacă aveți nevoie să împartă cu 10, sau orice altă constantă, este posibil preprocesorul conta 1/10, și apoi să facă - înmulțit cu acest număr. Un astfel de truc permite accelera foarte mult urechile de pe procesoare fără separator de hardware. De exemplu:

Dacă trebuie să fie multiplicate sau împărțit de către un număr întreg, este posibil să se facă această operație la fața locului, fără modificări și transformări

Desigur, principalul motiv pentru care lucrăm cu aceste numere - viteza. Pentru a lucra în mod eficient, avem nevoie de o mulțime de schimbări.

Pentru a efectua modificări se întâmple rapid în procesorul să fie așa-numitul butoi-schimbatorul. baril-schimbator de viteze - o bucată de ALU, care vă permite să se mute la orice număr de biți pe ciclu de ceas.

De multe ori, baril-schimbator de viteze este emulat de un multiplicator. De exemplu, pentru a schimba numărul la stânga de 3 biți, ea poate fi pur și simplu, înmulțită cu 8.

Există un alt truc. În cazul în care o parte fracționară a numărului de biți luați un multiplu de 8, procesorul poate selecta pur și simplu octet offset și nu utilizați modificările deloc. Acest lucru este valabil mai ales în cazul în care numărul este mai mic decât numerele razradnost bit procesor utilizate (de exemplu, pe 32 de biți număr de AVR).

complet

Ca și alte numere, numărul de puncte fixe, puteți ghiftui. De exemplu:

Pentru acest lucru, folosesc adesea numere cu biți întregi de zero. De exemplu, q0.32. De când înmulțit cu numărul de unități este mai mic decât numărul de unități mai mici vor fi întotdeauna un număr mai mic de unu, q0.32 preaplin la multiplicare imposibilă.

În plus, numărul de puncte fixe se comportă exact la fel ca și numere întregi obișnuite.

Debugging un punct fix poate fi foarte dificil, pentru că în loc de un simplu și clar „5“, în debugger, veți vedea un „327 680“. Din fericire, multe programe sunt capabile să arate rezultatele calculate în ceas-box. De exemplu, în IAR'e se poate scrie:

Număr-punct fix

După ce a venit oportunitatea, depanare a devenit mult mai ușor.

concluzie

În ciuda faptului că existau deja controlere disponibile cu FPU, numărul de puncte fixe ar trebui să fie în arsenalul oricărui embedder. Lucru este foarte util, rapid, elegant și portabil. Acest lucru este valabil mai ales pentru FPGA-uri, în cazul în care modificările sunt făcute conexiuni ușoare la registrele respective și, prin urmare, numărul de puncte de lucru fix acolo doar extrem de rapid.

Având în vedere înmulțirea și împărțirea cu numere de puncte fixe. multiplicare pe 64 de biți și diviziune, în special, poate fi foarte lent. Mai ales la 8- și 16-beatnicii. O înmulțire și împărțire poate fi realizată fără utilizarea de tipuri, cu o capacitate mai mare. De exemplu Q16 de multiplicare:

4 nevoie de multiplicare = 1616> 32 biți.
Divizia Q16:

Deși mușcat-înțelept, dar funcționează uneori bsstree decât diviziunea 64 în Cortex-m3. Poate puteți face chiar mai repede folosind divizia de hardware-ul 32/32 => 32 și algoritmul Knuth.

Wow, mulțumesc, nu a fost conștient de o astfel de abordare :) Utilizați întotdeauna de multiplicare pe 64 de biți. Va trebui să încercați pe sarcinile lor.

Articolul a fost adăugat. Și am adăugat despre înmulțirea prin numere întregi.

articole similare