Enkelt præcisionsnummer

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 14. marts 2016; checks kræver 33 redigeringer .

Antallet af enkelt præcision ( eng.  single precision , single ) er et udbredt computerformat til at repræsentere reelle tal, der optager 32 bit (4 bytes ) i hukommelsen . Som regel forstås det som flydende talformatet i IEEE 754 - standarden .

Enkeltpræcisions flydende kommatal svarer i præcision til et tal med 7-8 signifikante decimalcifre (gennemsnit 7,6), der spænder fra til ca.

I moderne computere understøttes floating-point-beregninger af en hardware- coprocessor ( FPU  - English  floating point unit ) . I en række computerarkitekturer er der dog ingen hardwareunderstøttelse af flydende kommatal, og derefter arbejdes der med dem i software.

Skilt
Bestille Mantissa
0 0 en en en en en 0 0 0 en 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 femten otte 7 0

For at beregne eksponenten trækkes eksponentforskydningen lig med 12710 = 7F16 = 011111112 ( det vil sige 011111002 - 011111112 = 12410 - 12710 = -310 ) fra otte-bit eksponentfeltet . Da heltalsdelen altid er lig med én i den normaliserede binære mantisse, skrives kun dens brøkdel i mantissefeltet, dvs. den faktiske størrelse af mantissen af ​​et enkelt præcisionstal er 24 bit. For at beregne mantissen lægges brøkdelen af ​​mantissen fra 23-bit feltet af brøkdelen af ​​mantissen 1.010000000000000000000000 2 til en . Tallet er lig med produktet af den fortegnede mantisse gange to i ordensmagten = 1,01 2 *2 10 -3 10 = 101 2 *2 10 -5 10 = 5 10 *2 10 -5 10 = 0,15625 10 .

Generelt mønster for bitvis adgang

union { flyde fl ; uint32_t dw ; } f ; int s = ( f . dw >> 31 ) ? -1 : 1 ; /* Skilt */ int e = ( f . dw >> 23 ) & 0xFF ; /* Bestil */ int m = /* Mantisse */ e ? ( f . dw & 0x7FFFFF ) | 0x800000 : ( f . dw & 0x7FFFFF ) << 1 ;

Den resulterende beregningsformel (enkelt præcisionstal) vil være s * (m * 2 ^ -23) * (2 ^(e-127)).

Eksempler på brug

Python

Konverterer en enkelt-præcision heltal repræsentation af et tal (som fire bytes, lav orden i begyndelsen) til Pythons indbyggede reelle tal type.

def dw2float ( dw_array ): assert ( len ( dw_array ) == 4 ) dw = int . from_bytes ( dw_array , byteorder = 'lille' , fortegn = Falsk ) s = -1 if ( dw >> 31 ) == 1 \ else 1 # Tegn e = ( dw >> 23 ) & 0xFF ; # Ordre m = (( dw & 0x7FFFFF ) | 0x800000 ) hvis e != 0 \ else (( dw & 0x7FFFFF ) << 1 ) # Mantisse m1 = m * ( 2 ** ( - 23 )) # Mantisse i float return s * m1 * ( 2 ** ( e - 127 ))

0,15625 10 i float-format skrives som 3E20000016 , hvilket svarer til fire bytes: [0x00,0x00,0x20,0x3E]. Program output:

I[1]: dw2float([0x00,0x00,0x20,0x3E]) Ud[1]: 0,15625 In[2]: dw2float([0x00,0x00,0x20,0xBE]) Ud[2]: -0,15625

Eksempler på enkeltpræcisionstal

Disse eksempler præsenteres som hexadecimale flydende decimaltal. De inkluderer fortegnsbit, eksponent og mantisse.

3f80 0000 = 1 c000 0000 = -2 7f7f ffff ≈ 3,40282346639 × 10 38 (maksimal enkelt præcision) 0000 0001 = 2 -149 ≈ 1,40129846432 × 10 -45 (Minimum positivt enkelt præcisionstal - denormaliseret ) 0080 0000 = 2 -126 ≈ 1,17549435082 × 10 -38 (Minimum normaliseret positivt enkelt præcisionstal) 0000 0000 = 0 8000 0000 = -0 7f80 0000 = uendelig ff80 0000 = -uendelig 3eaa aaab ≈ 1/3

Normalt, når du konverterer numeriske konstanter til flydende format, udføres afrunding. For eksempel rundes tallet 1/3 op.

Se også

Links