Az egyszeres pontosság száma ( angol. single precision , single ) egy széles körben elterjedt számítógépes formátum valós számok ábrázolására, 32 bitet (4 bájtot ) foglal el a memóriában . Általános szabály, hogy ez az IEEE 754 szabvány lebegőpontos számformátuma .
Az egyszeres pontosságú lebegőpontos számok pontossága egyenértékű egy 7-8 jelentős tizedesjegyből álló számokkal (átlag 7,6) és körülbelül .
A modern számítógépekben a lebegőpontos számításokat hardveres társprocesszor ( FPU - angol floating p oint u nit ) támogatja . Számos számítástechnikai architektúra azonban nem támogatja a lebegőpontos számokat hardveresen, így a velük való munka szoftveresen történik.
Jel | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Rendelés | Mantissa | |||||||||||||||||||||||||||||||
0 | 0 | egy | egy | egy | egy | egy | 0 | 0 | 0 | egy | 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 | tizenöt | nyolc | 7 | 0 |
A kitevő kiszámításához az 12710 = 7F16 = 011111112 ( azaz 011111112 = 12410 - 12710 = -310 ) értékkel egyenlő kitevő - eltolást levonjuk a nyolcbites kitevőmezőből . Mivel a normalizált bináris mantisszában az egész rész mindig egyenlő eggyel, ezért a mantissza mezőbe csak annak tört része kerül, azaz. egyetlen precíziós szám mantisszájának tényleges mérete 24 bit. A mantissza kiszámításához a mantissza 1.01000000000000000000000000000000000000000000000000000000000000 23 bites mezőjéből a mantissza tört részét hozzáadjuk egyhez . A szám egyenlő az előjeles mantissza szorzata kettővel a sorrend hatványával = 1,01 2 *2 10 -3 10 = 101 2 *2 10 -5 10 = 5 10 *2 10 -5 10 = 0,15625 10 .
Az eredményül kapott számítási képlet (egyetlen pontosságú szám) a következő lesz s * (m * 2 ^ -23) * (2 ^(e-127)).
Egy szám egyszeri pontosságú egész reprezentációját (négy bájtként, az elején alacsony rendű) a Python beépített valós számtípusává alakítja.
def dw2float ( dw_array ): assert ( len ( dw_array ) == 4 ) dw = int . from_bytes ( dw_array , byteorder = 'kis' , előjeles = False ) s = - 1 if ( dw >> 31 ) == 1 \ else 1 # Sign e = ( dw >> 23 ) & 0xFF ; # Sorrend m = (( dw & 0x7FFFFF ) | 0x800000 ) if e != 0 \ else (( dw & 0x7FFFFF ) << 1 ) # Mantissza m1 = m * ( 2 ** ( - 23 )) # Mantissza úszó vissza s * m1 * ( 2 ** ( e - 127 ))A 0,15625 10 lebegő formátumban 3E20000016 -nak van írva, ami négy bájtnak felel meg: [0x00,0x00,0x20,0x3E]. Program kimenet:
In[1]: dw2float([0x00,0x00,0x20,0x3E]) Out[1]: 0,15625 In[2]: dw2float([0x00,0x00,0x20,0xBE]) Out[2]: -0,15625Ezeket a példákat hexadecimális lebegőpontos számokként mutatjuk be. Tartalmazzák az előjelbitet, a kitevőt és a mantisszát.
3f80 0000 = 1 c000 0000 = -2 7f7f ffff ≈ 3,40282346639 × 10 38 (maximális egyszeri pontosság) 0000 0001 = 2 -149 ≈ 1,40129846432 × 10 -45 (Minimális pozitív egyszeri precíziós szám – denormalizálva ) 0080 0000 = 2 -126 ≈ 1,17549435082 × 10 -38 (Minimális normalizált pozitív egyszeri precíziós szám) 0000 0000 = 0 8000 0000 = -0 7f80 0000 = végtelen ff80 0000 = −végtelen 3eaa aaab ≈ 1/3Általában a numerikus állandók lebegő formátumba konvertálásakor a kerekítés történik. Például az 1/3 számot felfelé kerekítjük.