I datalogi er IEEE 754 en standard for flydende aritmetik udviklet af Institute of Electrical and Electronics Engineers . Det er i øjeblikket den mest anvendte standard til beregning af flydende nummer med CPU'er og FPU'er . Standarden definerer formaterne til repræsentation af flydende nummer ( tegn , mantissa , eksponent , denormaliserede tal ) og specielle værdier ( uendelig og NaN) sammen med et sæt flydende punktoperationer. Den beskriver også fem afrundingstilstande og fem undtagelser (inklusive de betingelser, hvorunder en undtagelse opstår, og hvad der sker i så fald).
Den originale version af IEEE 754, der stammer fra 1985, definerede fire formater til at repræsentere base 2 flydende nummer:
For eksempel i g- sproget bruger gcc- kompilatoren til 32-bit Intel-kompatible arkitekturer formatet enkel præcision til variabler af typen float , dobbelt præcision for variabler af typen dobbelt og dobbelt præcision eller udvidet dobbelt præcision (efter operativsystemet) for lange dobbeltvariabler . Men hvis SSE2-udvidelsen ikke bruges, afrundes alle beregninger til den samme præcision afhængigt af processorens dynamiske præcisionsindstilling (typisk dobbelt præcision eller udvidet dobbelt præcision, afhængigt af operativsystemet, kompileringsmuligheder og ændringer foretaget af programmer).
Standardens fulde titel var IEEE Standard for Binary Floating-Point Arithmetic (ANSI / IEEE Std 754-1985 ). Det er også kendt som IEC 60559: 1989, binær flydende aritmetik for mikroprocessorsystemer , hvilket også gør det til en (amerikansk) standard, da den er godkendt som en normativ reference i flere internationale ISO-standarder. Denne standard blev dog udvidet med en større revision i 2008 til andre grundlæggende formater (binær på 128 bit og decimal på 64 og 128 bit) samt udvekslingsformater (tilføjelse af formater, der er enten mindre præcise eller mere præcise) og udvidede formater ( generalisering af 1985-standarden med mere frihed til præcision og kodning end med udvekslingsformater); denne revision inkluderer også yderligere afrundingstilstande og strengere krav til overensstemmelse med hensyn til den forventede nøjagtighed af basale transcendentale funktionsoperationer og beregninger. Denne standard blev også revideret i 2019.
I et ord med længden W indekseres bitene fra 0 til W - 1 inklusive. Bit 0 placeres til højre, og det repræsenterer den mindst signifikante bit (dvs. enhedsbiten, som vil medføre den mindste variation, hvis den ændres).
Et flydende nummer består af tre elementer: mantissaen , eksponenten og tegnet. Den mest betydningsfulde bit er tegnbiten : hvis denne bit er på 1, er tallet negativt, og hvis det er på 0, er tallet positivt. De næste e- bits repræsenterer den partiske eksponent (undtagen speciel værdi), og de næste m- bits ( m mindst signifikante bits) repræsenterer mantissen.
Skilt | Bias-eksponent | Mantissa |
(1 bit) | ( e bits) | ( m bits) |
Eksponenten kan være positiv eller negativ. Den sædvanlige repræsentation af underskrevne numre ( 2's komplement ) ville dog gøre sammenligningen mellem flydende numre lidt vanskeligere. For at løse dette problem er eksponenten "skæv" for at gemme den som et usigneret nummer.
Denne bias er 2 e −1 - 1 ( e repræsenterer antallet af bits i eksponenten); det er derfor en konstant værdi, når antallet af bits e er fast.
Fortolkningen af et tal (andet end uendeligt) er derfor: værdi = tegn × mantissa × 2 ( eksponent - bias ) med
Den mest betydningsfulde bit af mantissen bestemmes af værdien af den partiske eksponent. Hvis den forudindtagne eksponent er forskellig fra 0 og fra , er den mest betydningsfulde bit af mantissen 1, og antallet siges at være "normaliseret". Hvis den forudindtagne eksponent er nul, er den mest betydningsfulde bit af mantissen nul, og antallet er denormaliseret .
Der er tre specielle tilfælde:
Vi kan sammenfatte det som følger:
Type | Bias-eksponent | Mantissa |
---|---|---|
Nuller | 0 | 0 |
Denormaliserede tal | 0 | forskellig fra 0 |
Normaliserede tal | på | nogen |
Uendelig | 0 | |
NaNs | forskellig fra 0 |
Et flydepunktsnummer med en enkelt præcision er lagret i et 32-bit ord : 1 tegnbit, 8 bit til eksponenten og 23 for mantissen.
Eksponenten er derfor forudindtaget af i dette tilfælde. Eksponenten for et normaliseret tal går derfor fra -126 til +127. Eksponenten -127 (som er forudindtaget i forhold til værdien 0) er reserveret til nul og denormaliserede tal, mens eksponenten 128 (forudindtaget til 255) er reserveret til at kode uendelige og NaN'er (se den foregående tabel).
Et normaliseret flydende nummer har en værdi v givet ved følgende formel:
v = s × 2 e × m .For eksempel for 0b 0 01111100 01000000000000000000000: tegnet er positivt, eksponenten er 124 - 127 = −3, og den signifikante del er 0b 1,01 dvs. 1,25 i decimal (1 × 2 0 + 0 × 2 −1 + 1 × 2 - 2 ); antallet repræsenteret er derfor +1,25 × 2 −3 eller +0,155625.
De denormaliserede tal følger det samme princip, bortset fra at e = −126 og m = 0+ mantissa (bemærk: til beregningen vil vi passe på at tage e = −126 og ikke −127, for at garantere kontinuiteten af dette repræsentation med den normaliserede repræsentation, da m = 0+ mantissa og ikke længere m = 1+ mantissa ).
Bemærkninger:
Her er en tabel, der opsummerer den foregående del med eksempler på 32-bit-tal med en præcision.
Type | Udstiller | Mantissa | Omtrentlig værdi | Afvigelse / tidligere |
---|---|---|---|---|
Nul | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0,0 | |
Mindste denormaliserede antal | 0000 0000 | 000 0000 0000 0000 0000 0001 | 1,4 × 10 −45 | 1,4 × 10 −45 |
Næste denormaliserede nummer | 0000 0000 | 000 0000 0000 0000 0000 0010 | 2,8 × 10 −45 | 1,4 × 10 −45 |
Næste denormaliserede nummer | 0000 0000 | 000 0000 0000 0000 0000 0011 | 4,2 × 10 −45 | 1,4 × 10 −45 |
Andet denormaliserede antal | 0000 0000 | 100 0000 0000 0000 0000 0000 | 5,9 × 10 −39 | |
Største denormaliserede antal | 0000 0000 | 111 1111 1111 1111 1111 1111 | 1.175 494 21 × 10 −38 | |
Mindste normaliserede antal | 0000 0001 | 000 0000 0000 0000 0000 0000 | 1.175 494 35 × 10 −38 | 1,4 × 10 −45 |
Næste standardnummer | 0000 0001 | 000 0000 0000 0000 0000 0001 | 1.175 494 49 × 10 −38 | 1,4 × 10 −45 |
Næsten dobbelt | 0000 0001 | 111 1111 1111 1111 1111 1111 | 2.350 988 56 × 10 −38 | 1,4 × 10 −45 |
Næste standardnummer | 0000 0010 | 000 0000 0000 0000 0000 0000 | 2.350 988 70 × 10 −38 | 1,4 × 10 −45 |
Næste standardnummer | 0000 0010 | 000 0000 0000 0000 0000 0001 | 2.350 988 98 × 10 −38 | 2,8 × 10 −45 |
Næsten 1 | 0111 1110 | 111 1111 1111 1111 1111 1111 | 0,999 999 94 | 0,6 × 10 −7 |
1 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1.000.000 00 | |
Næste nummer 1 | 0111 1111 | 000 0000 0000 0000 0000 0001 | 1.000.000 12 | 1,2 × 10 −7 |
Næsten det største antal | 1111 1110 | 111 1111 1111 1111 1111 1110 | 3.402 823 26 × 10 38 | |
Største standardnummer | 1111 1110 | 111 1111 1111 1111 1111 1111 | 3.402 823 46 × 10 38 | 2 × 10 31 |
Uendelig | 1111 1111 | 000 0000 0000 0000 0000 0000 | Uendelig | |
Første (denormaliserede) værdi af advarsel NaN | 1111 1111 | 000 0000 0000 0000 0000 0001 | Nix | |
Normaliseret NaN (alarm) | 1111 1111 | 010 0000 0000 0000 0000 0000 | Nix | |
Sidste (denormaliserede) værdi af advarsel NaN | 1111 1111 | 011 1111 1111 1111 1111 1111 | Nix | |
Første (denormaliserede) værdi af stille NaN | 1111 1111 | 100 0000 0000 0000 0000 0000 | Nix | |
Sidste (denormaliserede) værdi af stille NaN | 1111 1111 | 111 1111 1111 1111 1111 1111 | Nix |
Bemærkninger:
Lad os kode decimaltallet −118.625 ved hjælp af IEEE 754-mekanismen.
Vi har derfor −118.625 (dec) = 1100 0010 1110 1101 0100 0000 0000 0000 (bin) = C2ED4000 (hexa).
Formatet med dobbelt præcision er det samme som enkeltpræcisionen, bortset fra at felterne er større. Faktisk har den 52 mantissabit i stedet for kun 23 og 11 eksponentbiter i stedet for kun 8.
Mantissen er meget bred, mens eksponenten ikke er særlig bred. Dette skyldes, at præcision er ifølge skaberne af standarden vigtigere end amplitude.
NaN'erne og de uendelige er repræsenteret ved at indstille alle eksponentens bits til 1 (2047), men skelnes ved at indstille alle 52 mantissas bits til 0 for de uendelige og mindst en af disse 52 bit til 1 for Nope .
For normaliserede tal er eksponentforstyrrelsen +1023. For denormaliserede tal er eksponenten −1022 (den mindste eksponent for et normaliseret tal). Det er ikke -1023, fordi normaliserede tal har 1 før decimaltegnet, og denormaliserede tal ikke har. Som før underskrives nul og uendelig.
Bemærkninger:
Det er generelt bedst at sammenligne flydende tal ved hjælp af beregningsinstruktionerne for flydende punkt. Imidlertid gør denne repræsentation sammenligninger af visse undergrupper mulige byte for byte, hvis de har den samme byte rækkefølge og det samme tegn, og NaN'erne er ekskluderet.
For to positive numre a og b for positive positive giver sammenligningen mellem a og b (>, <eller ==) de samme resultater som sammenligningen af to underskrevne (eller usignerede) tal med de samme bits som a og b. Med andre ord kan to positive flydende numre (som ikke er NaN'er) sammenlignes med en underskrevet (eller usigneret) binær sammenligning. På grund af problemet med byteordre kan denne sammenligning ikke bruges i bærbar kode.
IEEE-standarden specificerer 5 afrundingstilstande:
I juni 2008, en større revision af IEEE 754 og IEEE 854 standarder er blevet godkendt af IEEE. Se: IEEE 754-2008 (en) .
Denne revision bringer nye base 2 og base 10 formater og specificerer repræsentationen af base 10 formater (ud over base 2).
Det normaliserer også en samlet ordrerelation for hver af de normaliserede numeriske datatyper, supplerer de sædvanlige ordrerelationer, som kun er delvise; faktisk er den normale rækkefølge kun total under forudsætning af at fjerne fra værdisættet, den negative nulværdi (normalt sammenlignet med lig med den positive nulværdi) og alle NaN-værdier (som hverken er ens, hverken overlegne eller ringere end andre, ikke engang dem selv).
På den anden side efterlader denne revision fleksibiliteten ved repræsentation og mulig skelnen mellem NaN-værdierne (placeringen og værdien af advarselsbit (erne) i mantissafeltet er ikke standardiseret, og brugen af de andre bits af mantissafeltet eller tegnet på en NaN-værdi for at kode en fejl forbliver afhængig af arkitekturen eller applikationerne).
En ny revision blev godkendt i juli 2019.