Enkeltpresisjon flytende punktformat- Single-precision floating-point format
Enkeltpresisjon flytende punktformat (noen ganger kalt FP32 eller float32 ) er et datamaskinnummerformat , som vanligvis opptar 32 bits i datamaskinminnet ; den representerer et bredt dynamisk område med numeriske verdier ved å bruke et flytende radikspunkt .
En flytende variabel kan representere et bredere tallområde enn en fastpunktsvariabel med samme bitbredde på bekostning av presisjon. En signert 32-bits heltall variabel har en maksimal verdi på 2 31. - 1 = 2147483647, mens en IEEE 754 32-bit basis-2 flyttalls variabel har en maksimalverdi på (2 - 2 -23 ) x 2 127 ≈ 3,4028235 × 10 38 . Alle heltall med 7 eller færre desimal siffer, og 2 n for et helt tall −149 ≤ n ≤ 127, kan konverteres nøyaktig til en IEEE 754 enkel presisjon flytende verdi.
I IEEE 754-2008- standarden blir 32-biters base-2-formatet offisielt referert til som binær32 ; den ble kalt singel i IEEE 754-1985 . IEEE 754 spesifiserer flere flytende typer, for eksempel 64-biters base-2 dobbel presisjon og mer nylig base-10-representasjoner.
Et av de første programmeringsspråkene som leverte datatyper med enkelt og dobbelt presisjon flytende punkt var Fortran . Før den utbredte adopsjonen av IEEE 754-1985, var representasjonen og egenskapene til flytende datatyper avhengig av datamaskinprodusenten og datamodellen og avgjørelser som ble tatt av programmeringsspråklige designere. F.eks. Var GW-BASICs enkelttypede datatype 32-biters MBF -flytepunktformat.
Enkelt presisjon kalles REAL i Fortran , SINGLE-FLOAT i Common Lisp , float i C , C ++ , C# , Java , Float i Haskell og Swift , og Single i Object Pascal ( Delphi ), Visual Basic og MATLAB . Men flyte i Python , Ruby , PHP , og Objective Caml og enkelt i versjoner av Octave før 3.2 refererer til dobbel presisjon tall. I de fleste implementeringer av PostScript og noen innebygde systemer er den eneste støttede presisjonen enkel.
| Flyttalls formater |
|---|
| IEEE 754 |
| Annen |
IEEE 754 binær flytende punktformat med én presisjon: binary32
IEEE 754 -standarden spesifiserer en binary32 som har:
- Skiltbit : 1 bit
- Eksponentbredde : 8 bits
- Betydelig og presis : 24 bits (23 eksplisitt lagret)
Dette gir fra 6 til 9 betydelige desimal sifre presisjon. Hvis en desimalstreng med høyst 6 signifikante sifre konverteres til IEEE 754 enkeltpresisjonsrepresentasjon, og deretter konverteres tilbake til en desimalstreng med samme antall sifre, bør det endelige resultatet matche den opprinnelige strengen. Hvis et IEEE 754 enkeltpresisjonsnummer konverteres til en desimalstreng med minst 9 signifikante siffer, og deretter konverteres tilbake til representasjon med én presisjon, må det endelige resultatet matche det opprinnelige tallet.
Tegnbiten bestemmer tegnet på tallet, som også er tegnet på betydningen. Eksponenten er et 8-bits usignert heltall fra 0 til 255, i forspent form : en eksponentverdi på 127 representerer det faktiske nullpunktet. Eksponenter varierer fra −126 til +127 fordi eksponenter på −127 (alle 0s) og +128 (alle 1s) er reservert for spesielle tall.
Den sanne betydningen inkluderer 23 brøkbiter til høyre for det binære punktet og en implisitt ledende bit (til venstre for det binære punktet) med verdi 1, med mindre eksponenten er lagret med alle nuller. Dermed vises bare 23 brøkbiter av betydningen i minneformatet, men den totale presisjonen er 24 bits (tilsvarer logg 10 (2 24 ) ≈ 7,225 desimal siffer). Bitene er lagt ut som følger:
Den virkelige verdien antas av en gitt 32-biters binær32- data med et gitt tegn , forspent eksponent e (det 8-bits usignerte heltallet) og en 23-biters brøkdel er
- ,
som gir
I dette eksemplet:
- ,
- ,
- ,
- ,
- .
og dermed:
- .
Merk:
- ,
- ,
- ,
- .
Eksponentkoding
Den enkeltpresisjonære binære flytende eksponenten er kodet ved hjelp av en offset-binær representasjon, med nullforskyvningen 127; også kjent som eksponentskjevhet i IEEE 754 -standarden.
- E min = 01 H −7F H = −126
- E max = FE H −7F H = 127
- Eksponentskjevhet = 7F H = 127
For å få den sanne eksponenten slik den er definert av den offset-binære representasjonen, må forskyvningen på 127 trekkes fra den lagrede eksponenten.
De lagrede eksponentene 00 H og FF H tolkes spesielt.
| Eksponent | brøk = 0 | brøk ≠ 0 | Ligning |
|---|---|---|---|
| 00 H = 00000000 2 | ± null | unormalt tall | |
| 01 H , ..., FE H = 00000001 2 , ..., 11111110 2 | normal verdi | ||
| FF H = 11111111 2 | ± uendelig | NaN (stille, signalering) | |
Minimum positiv normalverdi er og minimum positiv (subnormal) verdi .
Konvertering fra desimalrepresentasjon til binary32 -format
Generelt, se selve IEEE 754 -standarden for streng konvertering (inkludert avrundingsatferd) av et reelt tall til det tilsvarende binary32 -formatet.
Her kan vi vise hvordan du konverterer et ekte base-10 til et IEEE 754 binary32-format ved å bruke følgende disposisjon:
- Tenk på et reelt tall med et helt tall og en brøkdel, for eksempel 12.375
- Konverter og normaliser heltallsdelen til binær
- Konverter brøkdelen ved å bruke følgende teknikk som vist her
- Legg til de to resultatene og juster dem for å få en riktig sluttkonvertering
Konvertering av brøkdelen: Vurder 0,375, brøkdelen av 12,375. For å konvertere den til en binær brøk, multipliser brøkdelen med 2, ta heltallsdelen og gjenta med den nye fraksjonen med 2 til en brøkdel av null er funnet eller til presisjonsgrensen er nådd, som er 23 brøk siffer for IEEE 754 binary32 format .
- , representerer heltallsdelen det binære fraksjonstallet. Multipliser 0,750 med 2 for å fortsette
- , brøk = 0,011, avslutt
Vi ser at det kan være nøyaktig representert i binær som . Ikke alle desimalfraksjoner kan representeres i en endelig sifret binær brøk. For eksempel kan desimal 0,1 ikke representeres i binær nøyaktig, bare tilnærmet. Derfor:
Siden IEEE 754 binary32 -format krever at reelle verdier er representert i format (se Normalisert nummer , detormaliserte tallet ), flyttes 1100.011 til høyre med 3 sifre for å bli
Endelig kan vi se at:
Som vi utledes av:
- Eksponenten er 3 (og i partisk form er det derfor )
- Brøken er 100011 (ser til høyre for det binære punktet)
Fra disse kan vi danne den resulterende 32-biters IEEE 754 binary32-formatrepresentasjonen på 12.375:
Merk: Vurder å konvertere 68.123 til IEEE 754 binary32 -format: Ved å bruke fremgangsmåten ovenfor forventer du å få med de siste 4 bitene 1001. På grunn av standard avrundingsatferd for IEEE 754 -format, er det du får , hvis siste 4 bits er 1010.
Eksempel 1: Tenk på desimal 1. Vi kan se at:
Som vi utledes av:
- Eksponenten er 0 (og i partisk form er det derfor )
- Brøken er 0 (ser til høyre for det binære punktet i 1.0 er alt )
Fra disse kan vi danne den resulterende 32-biters IEEE 754 binary32-formatrepresentasjonen av reelt tall 1:
Eksempel 2: Vurder en verdi 0,25. Vi kan se at:
Som vi utledes av:
- Eksponenten er −2 (og i partisk form er det )
- Brøken er 0 (ser til høyre for binært punkt i 1.0 er alle nuller)
Fra disse kan vi danne den resulterende 32-biters IEEE 754 binary32-formatrepresentasjonen av reelt tall 0.25:
Eksempel 3: Vurder en verdi på 0,375. Vi så det
Derfor, etter å ha bestemt en representasjon på 0,375, kan vi fortsette som ovenfor:
- Eksponenten er −2 (og i partisk form er det )
- Brøken er 1 (ser til høyre for binært punkt i 1.1 er en singel )
Fra disse kan vi danne den resulterende 32-biters IEEE 754 binary32-formatrepresentasjonen av reelt tall 0.375:
Enkeltpresisjon eksempler
Disse eksempler er gitt i bits representasjon , i heksadesimal og binær , av den flyttallsverdi. Dette inkluderer tegnet, (partisk) eksponenten og betydningen.
0 00000000 000000000000000000000012 = 0000 000116 = 2−126 × 2−23 = 2−149 ≈ 1.4012984643 × 10−45
(smallest positive subnormal number)
0 00000000 111111111111111111111112 = 007f ffff16 = 2−126 × (1 − 2−23) ≈ 1.1754942107 ×10−38
(largest subnormal number)
0 00000001 000000000000000000000002 = 0080 000016 = 2−126 ≈ 1.1754943508 × 10−38
(smallest positive normal number)
0 11111110 111111111111111111111112 = 7f7f ffff16 = 2127 × (2 − 2−23) ≈ 3.4028234664 × 1038
(largest normal number)
0 01111110 111111111111111111111112 = 3f7f ffff16 = 1 − 2−24 ≈ 0.999999940395355225
(largest number less than one)
0 01111111 000000000000000000000002 = 3f80 000016 = 1 (one)
0 01111111 000000000000000000000012 = 3f80 000116 = 1 + 2−23 ≈ 1.00000011920928955
(smallest number larger than one)
1 10000000 000000000000000000000002 = c000 000016 = −2
0 00000000 000000000000000000000002 = 0000 000016 = 0
1 00000000 000000000000000000000002 = 8000 000016 = −0
0 11111111 000000000000000000000002 = 7f80 000016 = infinity
1 11111111 000000000000000000000002 = ff80 000016 = −infinity
0 10000000 100100100001111110110112 = 4049 0fdb16 ≈ 3.14159274101257324 ≈ π ( pi )
0 01111101 010101010101010101010112 = 3eaa aaab16 ≈ 0.333333343267440796 ≈ 1/3
x 11111111 100000000000000000000012 = ffc0 000116 = qNaN (on x86 and ARM processors)
x 11111111 000000000000000000000012 = ff80 000116 = sNaN (on x86 and ARM processors)
Som standard runder 1/3 opp, i stedet for nedover som dobbel presisjon , på grunn av det like store antallet bits i betydningen. Bitene på 1/3 utover avrundingspunktet 1010...er mer enn 1/2 av en enhet på det siste stedet .
Kodinger av qNaN og sNaN er ikke spesifisert i IEEE 754 og implementert ulikt på forskjellige prosessorer. Den x86 familien og ARM familie prosessorer bruker mest signifikante bit av significand feltet for å indikere en rolig NaN. De PA-RISC prosessorer bruker bit for å indikere en signale NaN.
Konvertering fra enkel presisjon binær til desimal
Vi starter med den heksadesimale representasjonen av verdien, 41C80000 , i dette eksemplet, og konverterer den til binær:
så deler vi den ned i tre deler: tegnbit, eksponent og betydning.
- Skiltbit:
- Eksponent:
- Betydelig:
Vi legger deretter den implisitte 24. bit til betydningen:
- Betydelig:
og dekode eksponentverdien ved å trekke fra 127:
- Rå eksponent:
- Avkodet eksponent:
Hver av de 24 bitene i betydningen (inkludert den implisitte 24. bit), bit 23 til bit 0, representerer en verdi, som starter med 1 og halvdeler for hver bit, som følger:
bit 23 = 1 bit 22 = 0.5 bit 21 = 0.25 bit 20 = 0.125 bit 19 = 0.0625 bit 18 = 0.03125 . . bit 0 = 0.00000011920928955078125
Betydningen i dette eksemplet har tre bits satt: bit 23, bit 22 og bit 19. Vi kan nå dekode betydningen ved å legge til verdiene representert av disse bitene.
- Avkodet betydning:
Da må vi multiplisere med basen, 2, til eksponentens kraft, for å få det endelige resultatet:
Og dermed
Dette tilsvarer:
hvor s er tegnbiten, x er eksponenten, og m er betydningen.
Presisjonsbegrensninger på desimalverdier i [1, 16777216]
- Desimaler mellom 1 og 2: fast intervall 2 −23 (1+2 −23 er den nest største flottøren etter 1)
- Desimaler mellom 2 og 4: fast intervall 2 −22
- Desimaler mellom 4 og 8: fast intervall 2 −21
- ...
- Desimaler mellom 2 n og 2 n+1 : fast intervall 2 n-23
- ...
- Desimaler mellom 2 22 = 4194304 og 2 23 = 8388608: fast intervall 2 −1 = 0,5
- Desimaler mellom 2 23 = 8388608 og 2 24 = 16777216: fast intervall 2 0 = 1
Presisjonsbegrensninger på heltallsverdier
- Heltall mellom 0 og 16777216 kan representeres nøyaktig (gjelder også for negative heltall mellom −16777216 og 0)
- Heltall mellom 2 24 = 16777216 og 2 25 = 33554432 runde til et multiplum av 2 (partall)
- Heltall mellom 2 25 og 2 26 runde til et multiplum av 4
- ...
- Heltall mellom 2 n og 2 n+1 runde til et multiplum av 2 n-23
- ...
- Heltall mellom 2 127 og 2 128 runde til et multiplum av 2 104
- Heltall større enn eller lik 2 128 avrundes til "uendelig".
Optimaliseringer
Utformingen av floating-point-format tillater forskjellige optimaliseringer, som følge av den enkle genereringen av en base-2-logaritme- tilnærming fra et heltallssyn av råbitmønsteret. Heltall aritmetikk og bitforskyvning kan gi en tilnærming til gjensidig kvadratrot ( rask invers kvadratrot ), vanligvis påkrevd i datagrafikk .
Se også
- IEEE-standard for flytende aritmetikk (IEEE 754)
- ISO/IEC 10967 , språkuavhengig regning
- Primitiv datatype
- Numerisk stabilitet