Număr unic de precizie

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 14 martie 2016; verificările necesită 33 de modificări .

Numărul de precizie unică ( ing.  precizie unică , single ) este un format de computer larg răspândit pentru reprezentarea numerelor reale, ocupând 32 de biți (4 octeți ) în memorie . De regulă, este înțeles ca formatul numărului în virgulă mobilă al standardului IEEE 754 .

Numerele cu virgulă mobilă cu precizie unică sunt echivalente ca precizie cu un număr cu 7-8 cifre zecimale semnificative (în medie 7,6) variind de la aproximativ .

În calculatoarele moderne, calculele în virgulă mobilă sunt susținute de un coprocesor hardware ( FPU -  floating point unit în engleză  ) . Cu toate acestea, într-o serie de arhitecturi de calcul nu există suport hardware pentru numerele în virgulă mobilă, iar apoi lucrul cu acestea se realizează în software.

Semn
Ordin mantisa
0 0 unu unu unu unu unu 0 0 0 unu 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  = 0,15625
31 24 23 16 cincisprezece opt 7 0

Pentru a calcula exponentul , offset-ul exponentului egal cu 12710 = 7F16 = 011111112 ( adică 011111002 - 011111112 = 12410 - 12710 = -310 ) este scăzut din câmpul de opt biți . Deoarece partea întreagă este întotdeauna egală cu unu în mantisa binară normalizată , numai partea sa fracțională este scrisă în câmpul mantisei, adică. dimensiunea reală a mantisei unui singur număr de precizie este de 24 de biți. Pentru a calcula mantisa, partea fracționată a mantisei din câmpul de 23 de biți a părții fracționale a mantisei 1,01000000000000000000000 2 este adăugată la unu . Numărul este egal cu produsul mantisei semnate înmulțit cu doi la puterea de ordine = 1,01 2 *2 10 -3 10 = 101 2 *2 10 -5 10 = 5 10 *2 10 -5 10 = 0,15625 10 .

Model general pentru acces pe biți

unire { float fl ; uint32_t dw ; } f ; int s = ( f . dw >> 31 ) ? -1 : 1 ; /* Semn */ int e = ( f . dw >> 23 ) & 0xFF ; /* Ordin */ int m = /* Mantissa */ e ? ( f . dw & 0x7FFFFF ) | 0x800000 : ( f . dw & 0x7FFFFF ) << 1 ;

Formula de calcul rezultată (număr unic de precizie) va fi s * (m * 2 ^ -23) * (2 ^(e-127)).

Exemple de utilizare

Python

Convertește o reprezentare întreagă cu o singură precizie a unui număr (ca patru octeți, de ordin scăzut la început) în tipul de număr real încorporat în Python.

def dw2float ( dw_array ): assert ( len ( dw_array ) == 4 ) dw = int . from_bytes ( dw_array , byteorder = 'little' , signed = False ) s = - 1 if ( dw >> 31 ) == 1 \ else 1 # Sign e = ( dw >> 23 ) & 0xFF ; # Order m = (( dw & 0x7FFFFF ) | 0x800000 ) if e != 0 \ else (( dw & 0x7FFFFF ) << 1 ) # Mantissa m1 = m * ( 2 ** ( - 23 )) # Mantissa in float return s * m1 * ( 2 ** ( e - 127 ))

0.15625 10 în format float este scris ca 3E20000016 , ceea ce este echivalent cu patru octeți: [0x00,0x00,0x20,0x3E]. Ieșire program:

În[1]: dw2float([0x00,0x00,0x20,0x3E]) Ieșire[1]: 0,15625 În[2]: dw2float([0x00,0x00,0x20,0xBE]) Ieșire[2]: -0,15625

Exemple de numere cu precizie unică

Aceste exemple sunt prezentate ca numere hexazecimale în virgulă mobilă. Acestea includ bit semn, exponent și mantise.

3f80 0000 = 1 c000 0000 = −2 7f7f ffff ≈ 3,40282346639 × 10 38 (precizie unică maximă) 0000 0001 = 2 -149 ≈ 1,40129846432 × 10 -45 (număr minim de precizie pozitivă - denormalizat ) 0080 0000 = 2 -126 ≈ 1,17549435082 × 10 -38 (număr de precizie unică pozitiv minim normalizat) 0000 0000 = 0 8000 0000 = -0 7f80 0000 = infinit ff80 0000 = −infinit 3eaa aaab ≈ 1/3

De obicei, la conversia constantelor numerice în format flotant, se face rotunjirea. De exemplu, numărul 1/3 este rotunjit în sus.

Vezi și

Link -uri