IEEE 754

IEEE 754- standarden ( ANSI / IEEE Std 754-1985; IEC-60559: 1989 - Internasjonal versjon) definerer standardrepresentasjoner for binære flytende tall i datamaskiner og spesifiserer nøyaktige prosedyrer for å utføre matematiske operasjoner, spesielt for avrunding. Det eksakte navnet på standarden er engelsk IEEE Standard for Binary Floating-Point Arithmetic for mikroprosessorsystemer (ANSI / IEEE Std 754-1985) .

Den nåværende utgaven ble utgitt under navnet ANSI / IEEE Std 754-2019 i juli 2019. IEEE 854-1987- standarden , med engelsk Tittel Standard for radix-uavhengig flyttallsaritmetikk , fullt integrert i IEEE 754-2008 .

oversikt

IEEE 754-1989-standarden definerer to grunnleggende dataformater for binære flytende punktum med 32 biters ( enkelt presisjon ) eller 64 biters ( dobbel presisjon ) minnekrav og to utvidede formater. Den IEEE 754-2008 inneholder de binære tallformatene 16 bit som med minifloat , 32 bit som singel , 64 bit som dobbelt og nye 128 bit. I tillegg ble desimalrepresentasjonene med 32 bits som minifloat, 64 og 128 bits lagt til.

Til slutt var det forslag og implementeringer av andre nummerformater som er utformet i henhold til prinsippene i IEEE 754-1989-standarden, og blir derfor ofte referert til som IEEE-tall, selv om de strengt tatt ikke er i samsvar med den gamle definisjonen. Disse inkluderer mini-flottørene integrert i de nye utgavene, som er ment for trening. 16-biters minifloats brukes av og til i grafisk programmering. Det finnes også flere antall formater med mer enn 64 biter som ikke er definert av IEEE 754 til 1989, slik som det 80-bits format ( utvidede presisjons Layout ... ), hvor IA-32 prosessorer bruker internt i sin klassiske flytepunkt enhet, FPU) for å gjøre dette.

Generell

Representasjonen av et flytende nummer

består av:

  • Sign (1 bit)
  • Mantissa ( biter)
  • Grunnlag (for normaliserte flytende punktum i henhold til IEEE 754 er )
  • Eksponent ( biter)

Tegnet lagres litt , så det markerer positive tall og negative tall.

Eksponenten benyttes som et ikke-negative binære tall ( noen ganger også referert til som karakteristisk eller eksponent forspent i det følgende) som er lagret ved den faste forskyvningsverdi tilsatt: . Biasverdien (engelsk: distortion) beregnes gjennom . Biasverdien brukes for å sikre at negative eksponenter kan lagres av et usignert nummer (karakteristikken ), uten alternative kodinger som f.eks. B. de to komplementene (sammenlign også overflødig kode ).

Mantissa er tross alt en verdi som beregnes fra mantissabitene med verdien som . I enklere termer, tenker man på Mantissenbitmuster igjen en "1", vedlagt: .

Denne prosedyren er mulig fordi vilkåret for alle representable tall alltid kan oppfylles ved normalisering (se nedenfor) . Siden mantissa alltid begynner til venstre med "1", trenger ikke denne biten lenger å lagres. Dette gir deg en ekstra nøyaktighet.

To eksponentverdier med spesielle bitmønstre er reservert for spesielle tilfeller, maksimumsverdien ( ) og minimumsverdien ( ). Spesielle tilfeller NaN og ∞ er kodet med maksimal eksponentverdi. Flytepunktet nummer 0 og alle denormaliserte verdier er kodet med null i eksponenten.

Verdier utenfor det normale verdiområdet (for store eller for små tall) er representert med ∞ eller −∞. Denne utvidelsen av verdiområdet tillater ofte nyttige ytterligere beregninger selv i tilfelle et aritmetisk overløp. I tillegg til tallet 0 er det også verdien −0. Mens resultatet er ∞, er verdien −∞. Ved sammenligning skilles det ikke mellom 0 og −0.

Verdiene NaN (for “ikke et tall”) brukes til å representere udefinerte verdier. Du trinn z. B. på som resultater av operasjoner som eller på. NaN er delt inn i signalering av NaN (signalering av NaN, NaNs) for eksepsjonelle forhold og stille NaN (stille NaN, NaNq).

Som et siste spesialtilfelle fyller denormaliserte tall (referert til som subnormale tall i IEEE 754r) området mellom det minste normaliserte flytende punktet når det gjelder absolutt verdi og null. De lagres som faste punktnumre og har ikke samme presisjon som de normaliserte tallene. På grunn av designet har de fleste av disse verdiene gjensidig verdi ∞.

Tallformater og andre spesifikasjoner av IEEE 754-standarden

IEEE 754 skiller mellom fire representasjoner: enkelt eksakt ( enkelt ), utvidet enkelt eksakt (enkelt utvidet), dobbelt eksakt ( dobbelt ) og utvidet dobbelt eksakt (dobbelt utvidet) tallformat. Bare et minimum antall biter kreves for de utvidede formatene. Det nøyaktige antall biter og forspenningsverdien overlates til implementøren. De grunnleggende formatene er fullstendig definert.

Fremfor alt bestemmer antall eksponentbiter maksimum og minimum av tallene som kan representeres. Antall mantissabiter bestemmer ( relative se nedenfor ) nøyaktigheten til disse tallene (og bare i liten grad maksimum og minimum).

Type Størrelse (1 + r + p) Eksponent (r) Mantissa (p) Verdier av eksponenten (e) Bias-verdi (B)
enkelt 32 bit 8 bit 23 bit −126 ≤ e ≤ 127 127
enkelt utvidet ≥ 43 bit ≥ 11 bit ≥ 31 bit e min ≤ −1022
e maks ≥ 1023
ikke
spesifisert
dobbelt 64 bit 11 bit 52 bit −1022 ≤ e ≤ 1023 1023
dobbelt utvidet ≥ 79 bit ≥ 15 bit ≥ 63 bit e min ≤ −16382
e max ≥ 16383
ikke
spesifisert
firdobbelt 128 bit 15 bit 112 bit −16382 ≤ e ≤ 16383 16383

De to siste eksemplene viser et minimalt utvidet format.

Følgende begrensning av de respektive tallene gir resultater for de angitte formatene. De minste tallene når det gjelder absolutt verdi normaliseres ikke her. Den relative avstanden mellom to flytende tall er større enn og mindre enn eller lik . Avstanden (og i dette tilfellet ogsårelativ avstand) mellom flytende nummer og neste større flytende nummer . Desimaler beskriver antall steder med et desimaltall som kan lagres uten tap av presisjon. Mantissaen er aritmetisk en større enn lagret på grunn av den implisitte biten.

Type desimaltall
steder

Minste antall (målt i mengde)
(normalisert)

Minste antall
(målt i mengde) (denormalisert)
Største antall
enkelt 2 - (23 + 1)
≈ 6,0 · 10 −8
7… 8 2 −126
≈ 1.2 · 10 −38
2 −23 × 2 −126
≈ 1.4 · 10 −45
(2−2 −23 ) × 2127
≈ 3.4 · 10 38
enkelt utvidet, minimum 2 - (31 + 1)
≈ 2.3 · 10 −10
9… 10 2 −1022
≈ 2.2 · 10 −308
2 −31 × 2 −1022
≈ 1.0 · 10 −317
(2−2 −31 ) × 2 1023
≈ 1,8 · 10 308
dobbelt 2 - (52 + 1)
≈ 1.1 · 10 −16
15 ... 16 2 −1022
≈ 2.2 · 10 −308
2 −52 × 2 −1022
≈ 4,9 · 10 −324
(2−2 −52 ) × 2 1023
≈ 1,8 · 10 308
dobbelt utvidet, minimum 2 - (63 + 1)
≈ 5,4 · 10 −20
19… 20 2 −16382
≈ 3.4 · 10 −4932
2 −63 × 2 −16382
≈ 3.7 · 10 −4951
(2−2 −63 ) × 2 16383
≈ 1.2 · 10 4932
Singel i stor endian representasjon

Figuren tilstøtende viser arrangementet av biter av en enkelt . Den spesifikke plasseringen av bitene i minnet i et datasystem kan avvike fra denne figuren og avhenger av den respektive bytesekvensen (liten / stor endian) og andre datamaskinkarakteristikker.

Arrangementet med den signerte eksponenten mantissa i nøyaktig denne rekkefølgen bringer de viste flytepunktsverdiene (innenfor et tegnområde) i samme rekkefølge som heltallverdiene som kan representeres av samme bitmønster. Dette betyr at de samme operasjonene kan brukes til å sammenligne flytende tall som for å sammenligne hele tall. Kort oppsummert: Flytende tall kan sorteres leksikalt.

Det skal imidlertid bemerkes at for å øke negative heltallverdier, har den tilsvarende flytpunktverdien en tendens til minus uendelig, dvs. at sorteringen blir reversert.

Eksempler

Beregning av desimaltall → IEEE754 flytende nummer

Nummeret skal konverteres til et flytende nummer ved å bruke den eneste IEEE-standarden.

  1. Konvertering av desimal til et dobbelt fast punkt usignert nummer så






  2. Normalisering og bestemmelse av eksponenten
    Ekskluderer den høyeste effekten av to: Forspenningsverdien for eksponenten er sammensatt av null og en. Det følgende gjelder: Eksponenten av kraften fra to er således lagret med skjevhet B. Normaliseringen av kan også oppnås ved å skifte desimaltegnet i det binære systemet: Mantissen er og eksponenten med skjevhet .






  3. Bestem tegnet litt
    her positivt, altså .
  4. Dann det flytende punktet Nummeret på mantissens forpunkt er utelatt som en skjult bit .

Beregning av IEEE754 flytende nummer → desimaltall

Nå skal flytende nummer ovenfra konverteres til et desimaltall, så følgende IEEE754-nummer er gitt

  1. Beregne eksponenten Konvertere eksponenten til et desimaltall Siden eksponentverdien er pluss forspenningen, trekkes forspenningen: det er eksponenten også.

  2. Beregning av mantissaen
    Siden dette er et normalisert tall, vet vi at det har en 1 foran desimaltegnet: Nå må desimaltegnet flyttes 4 plasser til høyre:
  3. Konvertering til desimaltall
    før: Desimaler: For å bevare verdien av Nachkommazahl har du den samme prosessen utført som om det er heltall, men i motsatt retning, dvs. fra venstre til høyre. Eksponenten må være negativ og starte med en 1.



  4. Bestem
    tegnet Tegnbiten er et null, så det er et positivt tall.
  5. Kombiner komponenter for å danne et desimaltall

Tolkning av tallformatet

Tolkningen avhenger av eksponenten. For forklaring er S verdien av tegnet bit (0 eller 1), E er verdien av eksponenten som et ikke-negativt heltall mellom 0 og E max = 11… 111 = 2 r −1, M er verdien av mantissen som et ikke-negativt tall og med B betegner forspenningsverdien. Tallene r og p betegner antall eksponentbiter og mantissabiter.

Karakteristisk Mantissa M betydning Uformelt betegnelse
E = 0 M = 0 (−1) S × 0 ± 0 Null (tilhører denorm.)
E = 0 M > 0 (−1) S × M / 2 p × 2 1− B ± 0, M × 2 1− B denormalisert antall
0 < E <2 r −1 M > = 0 (−1) S × (1+ M / 2 p ) × 2 E - B ± 1, M × 2 E - B normalisert nummer
E = 2 r −1 M = 0 Uendelig ± ∞ Uendelig
E = 2 r −1 M > 0 intet nummer intet tall (NaN)

null

Null representerer det signerte nullet . Tall som er for små til å vises (understrøm) avrundes til null. Skiltet deres beholdes. Negative små tall er avrundet til −0,0, positive tall til +0,0. I en direkte sammenligning anses imidlertid +0,0 og −0,0 for å være like.

Normalisert antall

Mantissen består av de første n essensielle sifrene i den binære representasjonen av tallet som ennå ikke er normalisert. Det første sifferet er det viktigste sifferet (dvs. lengst til venstre) enn 0. Siden et annet siffer enn 0 bare kan være et 1 i det binære systemet, trenger ikke denne første 1 å lagres eksplisitt; I samsvar med IEEE 754-standarden er bare følgende sifre lagret; det første sifferet er et implisitt siffer eller en implisitt bit ( skjult bit ). Dette "sparer" 1 bit lagringsplass, for å si det sånn.

Denormalisert antall

Hvis et tall er for lite til å lagres i normalisert form med den minste eksponenten som ikke er null, lagres det som et "denormalisert tall". Din tolkning er ikke lenger ± 1, mantissa · 2 eksponent , men ± 0, mantissa · 2 de . Det er de verdien av de minste "normal" eksponent. Dette kan brukes til å fylle gapet mellom det minste normaliserte tallet og null. Denormaliserte tall har imidlertid en lavere (relativ) nøyaktighet enn normaliserte tall; antall signifikante sifre i mantissaen synker mot null.

Hvis resultatet (eller mellomresultatet) av en beregning er mindre enn det minste representable antallet av den endelige aritmetikken som brukes, blir den vanligvis avrundet til null; dette kalles understrøm av flytende punktsaritmetikk. understrøm . Siden informasjon går tapt i prosessen, prøver man å unngå understrømning så langt som mulig. De denormaliserte tallene i IEEE 754 forårsaker en gradvis understrømning (engl. Gradvis understrømning ) av "rundt 0" 2 24 (for enkelt ) og 2 53 (for dobbelt må settes inn) verdier, som alle har samme absolutte avstand fra hver andre og uten disse denormaliserte verdiene, ville ikke være representable, men måtte føre til understrøm.

På prosessorsiden implementeres denormaliserte tall med lav prioritet på grunn av deres proporsjonalt sjeldne forekomst, og fører derfor til en betydelig nedgang i utførelsen så snart de fremstår som en operand eller som et resultat av en beregning. For å avhjelpe dette (f.eks. For dataspill), har Intel tilbudt den ikke-IEEE-754-kompatible funksjonaliteten siden SSE2 for å deaktivere denormaliserte tall helt (MXCSR-alternativene "flush to zero" og "denormals is zero"). Flytende tall som kommer inn i dette området er avrundet til 0.

Uendelig

Flytpunktverdien uendelig representerer tall hvis størrelse er for stor til å bli representert. Det skilles mellom positiv uendelig og negativ uendelig. Beregningen av 1.0 / 0.0 resulterer i "positiv uendelig" i henhold til definisjonen av IEEE-754.

Ikke noe ( NaN )

Dette viser ugyldige (eller udefinerte) resultater, f.eks. B. når du prøver å beregne kvadratroten til et negativt tall. Noen "ubestemte uttrykk" resulterer i "intet tall", for eksempel 0,0 / 0,0 eller "uendelig" - "uendelig". I tillegg brukes NaN i forskjellige applikasjonsområder for å representere “ingen verdi” eller “ukjent verdi”. Spesielt brukes verdien med bitmønsteret 111 ... 111 ofte for et "ikke-initialisert flytende punktnummer".

IEEE 754 krever to typer ikke-tall: stille NaN (NaNq - stille ) og signalering NaN (NaNs - signalering ). Begge representerer eksplisitt ikke tall. I motsetning til et stille NaN utløser en signalering NaN et unntak (felle) hvis det oppstår som en operand av en aritmetisk operasjon.

IEEE 754 gjør det mulig for brukeren å deaktivere disse fellene. I dette tilfellet behandles signalering av NaN som stille NaN.

Signalering av NaN kan brukes til å fylle uinitialisert dataminne, slik at hver bruk av en uinitialisert variabel automatisk gir et unntak.

Silent NaN gjør det mulig å håndtere beregninger som ikke kan gi et resultat, for eksempel fordi de ikke er definert for de angitte operandene. Eksempler er divisjon null med null eller logaritmen til et negativt tall.

Stille og signaliserende NaN er forskjellige i den høyeste mantissabiten. Med stille NaN er dette 1, med signalering NaN 0. De resterende mantissabittene kan inneholde tilleggsinformasjon, f.eks. B. årsaken til NaN. Dette kan være nyttig for unntakshåndtering. Imidlertid spesifiserer standarden ikke hvilken informasjon som er inneholdt i de gjenværende mantissabitene. Evalueringen av disse bitene er derfor plattformavhengig.

Skiltbiten har ingen betydning med NaN. Det er ikke spesifisert hvilken verdi tegnbiten har for returnert NaN.

Avrundinger

IEEE 754 skiller mellom binær avrunding og binær desimalavrunding, for hvilke lavere kvalitetskrav gjelder.

Binær avrunding må avrundes til nærmeste representable nummer. Hvis dette ikke er klart definert (nøyaktig i midten mellom to representerbare tall), avrundes det slik at den minst betydningsfulle biten av mantissen blir 0. Statistisk sett er den i 50% av tilfellene avrundet og i de andre 50% av tilfellene, slik at den statistiske driften som er beskrevet av Knuth, unngås i lengre beregninger.

En implementering som er i samsvar med IEEE 754, må gi ytterligere tre avrundinger som kan innstilles av programmereren: Avrunding mot + uendelig (alltid avrunding opp), avrunding mot − uendelig (alltid avrunding ned) og avrunding mot 0 (reduser alltid mengden).

Operasjoner

IEEE 754-kompatible implementeringer må gi operasjoner for regning, beregning av kvadratrot, konvertering og sammenligning. En annen gruppe operasjoner anbefales i vedlegget, men ikke obligatorisk.

Aritmetikk og kvadratrot

IEEE 754 krever av en (maskinvare eller programvare) implementering nøyaktig avrundede resultater for operasjonstilsetning, subtraksjon, multiplikasjon og deling av to operander, samt operasjons kvadratroten til en operand. Dette betyr at det bestemte resultatet må være det samme som resultatet av en eksakt utførelse av den tilsvarende operasjonen med påfølgende avrunding.

Videre kreves det å beregne resten etter deling med et heltalsresultat. Denne resten er definert av , som et heltall, eller i tilfelle av et partall også . Resten må bestemmes nøyaktig uten avrunding.

Konverteringer

Det kreves konvertering mellom alle støttede flytende punktformater. Når du konverterer til et flytende punktformat med mindre presisjon, må det avrundes nøyaktig slik det allerede er beskrevet under aritmetikk.

IEEE 754-kompatible implementeringer må gi konverteringer mellom alle støttede flytende punktformater og alle støttede heltallformater. IEEE 754 definerer ikke heltallformatene mer detaljert.

For hvert støttede flytende punktformat må det være en operasjon som konverterer dette flytende nummeret til det nøyaktig avrundede hele tallet i samme flytende punktformat.

Til slutt må det være konverteringer mellom det binære flytende punktformatet og et desimalformat som oppfyller nøyaktig beskrevne minimumskrav til kvalitet.

Sammenligninger

Flytpunkttall i henhold til IEEE 754 må kunne sammenlignes. Standarden definerer de nødvendige sammenligningsoperasjonene og de nødvendige resultatene for alle mulige spesielle tilfeller (spesielt NaN, uendelig og 0). Sammenlignet med "skolematematiske" sammenligninger (mindre, lik eller større), er et mulig resultat i henhold til IEEE 754 spesielt uordnet ("ikke klassifisert") hvis en av sammenligningsoperandene er NaN. To NaN er fundamentalt forskjellige, selv om bitmønstrene deres stemmer overens.

Anbefalte operasjoner

Ti ytterligere operasjoner anbefales i vedlegget til standarden. Siden de i utgangspunktet er behov for uansett i en implementering, koker denne anbefalingen til slutt ned til å overføre operasjonene til programmereren. Disse operasjonene er (i C-notasjon): copysign (x, y), invertsign (x), scalb (y, n), logb (x), neste etter (x, y), endelig (x), isnan (x), x ≠ y, uordnet (x, y), klasse (x). Detaljene i implementeringen, spesielt igjen for spesielle tilfeller NaN etc., er også foreslått.

Unntak, flagg og feller

Hvis unntak oppstår under beregningen, settes statusflagg. Standarden forutsetter at brukeren kan lese og skrive disse flaggene. Flaggene er "klissete": når de er satt, beholdes de til de eksplisitt tilbakestilles. For eksempel er å sjekke flaggene den eneste måten å skille 1/0 (= uendelig) fra et overløp.

Standarden anbefaler også å aktivere fellehåndterere: Hvis det oppstår et unntak, blir fellehåndtereren kalt i stedet for å sette statusflagget. Det er slike fellehåndterings ansvar å sette eller slette det tilsvarende statusflagget.

Unntak er delt inn i 5 kategorier i standarden: overløp, understrøm, divisjon med null, ugyldig drift og unøyaktig. Et statusflagg er tilgjengelig for hver klasse.

historie

På 1960- og begynnelsen av 1970-tallet hadde hver prosessor sitt eget format for flytende nummer og sin egen FPU, eller flytende punktprogramvare, som ble brukt til å behandle det formatet. Det samme programmet kan gi forskjellige resultater på forskjellige datamaskiner. Kvaliteten på de forskjellige flytepunktsregningene var også veldig forskjellig.

Rundt 1976 planla Intel sin egen FPU for mikroprosessorer og ønsket at best mulig løsning for aritmetikken skulle implementeres. Møter startet i 1977 i regi av IEEE for å standardisere FPUer for flytende punktaritmetikk for mikroprosessorer. Det andre møtet fant sted i november 1977 i San Francisco , ledet av Richard Delp . En av de ledende deltakerne var William Kahan .

Rundt 1980 ble antallet forslag til standarden redusert til to: KCS-forslaget (ifølge forfatterne K ahan, C oonen og S tone, 1977) motsatte seg til slutt alternativet fra DEC (F-format, D-format og G-format). En viktig milepæl på veien til normen var diskusjonen om hvordan man skulle håndtere understrømmen , som hadde blitt neglisjert av de fleste programmerere til da.

Samtidig med utviklingen av standarden implementerte Intel stort sett standardforslagene i Intel FPU 8087 , som ble brukt som flytende punkt-prosessor for 8088. Den første versjonen av standarden ble vedtatt i 1985 og utvidet i 2008.

litteratur

  • IEEE 754: omtrykt i SIGPLAN Notices , bind 22, nr. 2, februar 1987, s. 9-25
  • Jean-Michel Muller: Elementære funksjoner - algoritmer og implementering . 2. utgave. Birkhäuser, Lyon 2006, ISBN 0-8176-4372-9 .

weblenker

Commons : IEEE 754  - samling av bilder, videoer og lydfiler

Individuelle bevis

  1. ^ IEEE Standard for Floating-Point Arithmetic . I: IEEE Std 754-2019 (Revisjon av IEEE 754-2008) . Juli 2019, s. 1-84 , doi : 10.1109 / IEEESTD.2019.8766229 ( ieee.org [åpnet 5. februar 2020]).
  2. IEEE 754-2008: Standard for flytende punktaritmetikk, IEEE Standards Association, 2008, doi: 10.1109 / IEEESTD.2008.4610935
  3. ^ David Goldberg: Hva enhver dataloger bør vite om flytepunktsaritmetikk . I: ACM Computing Surveys . 23, 1991, s. 5-48. doi : 10.1145 / 103162.103163 . Hentet 2. september 2010.
  4. Shawn Casey: x87 og SSE Floating Point Assists i IA-32: Flush-To-Zero (FTZ) og Denormals-Are-Zero (DAZ) . 16. oktober 2008. Hentet 3. september 2010.