Flytende nummer

Et flytende punkt - ofte flytende nummer kalt ( engelsk flytende nummer eller en kort float , bokstavelig talt nummer med flottierendem- punkt eller [sannsynligvis fortsett lehnübersetzt ] flytpunkt ) - er en omtrentlig representasjon av et reelt tall .

Nøyaktig representerbare flytpunkttall for forskjellige mantissalengder, base: 2, eksponent −3 til 1

Settet med flytende tall er en delmengde av de rasjonelle tallene . Sammen med operasjonene som er definert på dem ( flytende aritmetikk ), danner flytende tall en endelig aritmetikk som ble utviklet primært med hensyn til numeriske beregninger med ( binære ) datamaskiner .

Grunnleggende

problem

Alle (mekaniske eller elektroniske) aritmetiske hjelpemidler fra kulerammen til datamaskinen bruker faste punktnumre som den enkleste formen for tallrepresentasjon . En stort sett begrenset sekvens av sifre lagres og komma antas i en fast posisjon.

Ved større beregninger oppstår uunngåelig overløp , som gjør det nødvendig å skalere verdiene og beregne dem på nytt for å bringe det endelige resultatet og alle mellomresultatene inn i det tillatte verdiområdet. Denne skaleringen er tidkrevende og må automatiseres.

Eksponensiell notasjon

En åpenbar ide som fører direkte til flytende tall er å lagre det nøyaktige stedet for kommaet for hver verdi. Dette betyr matematisk ingenting, men representasjon av tall med to verdier, den mantissen og eksponent : . Friheten i valget av eksponenten kan brukes til å bringe mantissaen inn i et fast verdiområde, for eksempel . Dette trinnet kalles normalisering av mantissaen.   

Eksempel: Verdien på lysets hastighet er

Bare mantissen til den siste representasjonen er normalisert.

Denne betegnelsen har lenge vært brukt av fysikere og matematikere for å indikere veldig store og svært små tall. Selv i dag blir flytende punktnotasjon på lommeregner derfor spesielt referert til som det vitenskapelige formatet (sci) .

En kompakt variant av den eksponentielle notasjonen brukes ofte av programmerere for å legge inn og utføre tall i tekstform, f.eks. F.eks. I kildekoden eller i feilsøkingsprogrammet : 2.99792458e8 (= 2.997.924.58 · 10 8 ) eller 3.141592653589793d0 ( d brukes til tall med dobbel presisjon ). Den e eller d er å forstå som et kort form av “ganger 10 til strøm”.

Flytepunkt-aritmetikk

For beregninger med flytende tall blir hvert tall og hvert mellomresultat skalert individuelt (i motsetning til global skalering). Skalering (beregning av eksponenten) for hvert mellomresultat krever ytterligere beregningsinnsats og ble derfor unngått så langt som mulig til langt ut på 1980-tallet. Datamaskinene til den tiden hadde ikke en flytende prosessor som standard . En annen faktor var de høyere minnekravene til tall med flytende punkt, som bare kunne begrenses av foregående høyere presisjon. Følgelig hadde bare de første superdatamaskiner (tallknusing) et flytende punkt eller minst en maskinvare som støtter en programvare-flytende-punkt-aritmetikk.

Valget av base 10 er vilkårlig og skylder bare det vanlige desimalsystemet. Flytende tall kan vises med en hvilken som helst base; generelt gjelder hvilken som helst valgt base . Bruk kalkulatorer (overveiende), (sjelden i dag) eller (f.eks. For finansmatematikk, se nedenfor). Enhver base er betingelsen for normaliserte tall .

historisk utvikling

Den første dokumenterte bruken av flytepunktet dateres tilbake til cirka 2700 år gammel: I Mesopotamia (Mesopotamia) ble det utført vitenskapelige beregninger ved hjelp av den utførte basen, og eksponenten (et stort sett lite heltall) blir ganske enkelt ført i hodet. Inntil nylig var den samme prosedyren vanlig for beregninger med en lysbilderegel .

I regnemaskiner , Konrad Zuses anvendes sin egen flytepunkt representasjon for sine datamaskiner Z1 og Z3 for første gang.

presentasjon

I forrige avsnitt ble grunnparametrene til et flytende nummer allerede presentert. Det er base , antall mantissasteder og antall eksponentplasser . I tillegg er det andre parametere som er ment å lette aritmetiske operasjoner under beregninger. Denne delen beskriver kort parametrene og bitfeltene til et generelt flytpunkt.

Utgangspunkt

En parameter er den valgte basen . Tall direkte behandlet av mennesker bruker enten eller . I dette spesielle tilfellet brukes prefiksene kilo = 1000 1 , mega = 1000 2 , giga = 1000 3 , tera = 1000 4 og milli = 1000 −1 , micro = 1000 −2 , nano = 1000 −3 , pico brukes til eksponent = 1000 −4 av det internasjonale enhetssystemet .

I data dual systemet og dets slektninger har seiret, og det er baser , og vanlig. Siden IEEE 754- standarden for flytende nummer, har basen blitt brukt nesten utelukkende i moderne datamaskiner .

mantissa

Den mantissen inneholder sifrene i flyttall. Hvis du lagrer flere sifre, øker nøyaktigheten. Antall mantissasifre uttrykker hvor nøyaktig tallet er tilnærmet. Dette flytpunktet er enten direkte angitt eller i form av det minste antallet som er beskrevet som kan legges til en og en for en annen resultatforsyning ( ; minimal!) (W d i egenskaper ..).

Eksempel: For IEEE-754-numre av typen Single med basen er mantissen siffer. Her er 1.19209289551e - 0007.

eksponent

Etter normalisering lagrer eksponenten det eksakte stedet for kommaet og dermed størrelsesorden av tallet. Antallet eksponentsifre begrenser de mulige variasjonene av kommaet og beskriver således verdiområdet for de viste flytnumrene. For å beskrive et system med flytende tall, spesifiserer man den minste og størst mulige eksponenten eller antall eksponenter og skiftet til 0 (skjevhet) .

Eksempel: For IEEE 754-tall av typen Single med basen , er den minste mulige eksponenten −126 og den største er 127. Dette betyr at det største flytpunktet som kan representeres i dette systemet og det minste positive normaliserte flytende punktet . Disse verdiene og beskriver det tillatte verdiområdet.

normalisering

Representasjonen av et flytende nummer er i utgangspunktet ikke klart definert. Nummer 2 kan skrives som eller også .

For å tvinge bruken av en tydelig definert representasjon, blir derfor ofte normaliserte flytende tall brukt, der mantissaen blir ført inn i et definert område. To åpenbare normaliseringsforhold er og . I henhold til den første regelen ville tallet 2 bli skrevet som, representasjonen ville da ikke være tillatt. Det er lettere å beregne med normaliserte tall, og det var grunnen til at noen implementatorer av flytende punkt-aritmetikk bare tillot normaliserte tall. Imidlertid kan ikke tallet 0 vises på en normalisert måte.

Det skilles - i forhold til vanlig base 10 i tallsystemet:

  • Vitenskapelig notasjon med påfølgende normalisering på
    • Eksempel: 10000 = 1e4. plass
  • Teknisk notasjon med normalisering til , med f som kraften til antall gjenværende signifikante sifre i måleusikkerheten for beregningsnøyaktigheten (denormaliserte sifre) . Bare multipler av 3 vises i eksponenten - når du beregner med måleenheter , kan denne representasjonen enkelt konverteres til enhetsprefikser, samt gruppering av sifre med tusenvis som skiller dem, eller kan genereres fra dem
    • Eksempel: 10.000 m = 10e3 m= 10 km
    • Betydning: 10.00e3 m= 10 000 ± 5 m (4 signifikante sifre knyttet til måling i kilometer medavrunding), men0.01e6 m= 10.000 ± 5000 m (2 signifikante sifre med hensyn til måling i mm) - der den nøyaktige informasjonen om standard og utvidet måleusikkerhetfølgerDIN1319-3 ellerISO / BIPM Guide(GUM, ENV 13005)
  • IEEE 754 (flytende tall for mikroprosessorer) bruker normaliseringsbetingelsen for normaliserte tall og tillater ytterligere denormaliserte (subnormale) tall mellom 0 og minpos.

Representasjon av eksponentens tegn med eller uten skjevhet

I flytende punkt-systemer er eksponenten et signert nummer. Dette krever implementering av ytterligere signert heltallsregning for eksponentberegninger. Denne ekstra innsatsen kan unngås hvis et fast tall , forspenningsverdien eller overskuddet, legges til eksponenten og summen lagres i stedet for eksponenten . Denne summen er da et usignert positivt tall. Mesteparten av tiden er bruken av en skjevhet kombinert med representasjonen av 0 gjennom .

Et alternativ som sjelden finnes i dag er representasjonen av eksponenten i tos komplement , i ens komplement eller som et tegn på beløpet.

Fordelen med partisk representasjon er at det gjør det lettere å sammenligne størrelsen på to positive flytende tall. Det er tilstrekkelig at antall sekvenser em , så hver eksponent e etterfulgt av mantissa m , lexikografisch å sammenligne. En flytende punkt subtraksjon etterfulgt av en sammenligning til null ville være langt mer kompleks. Ulempen med den partiske representasjonen sammenlignet med de to komplementrepresentasjonen er at etter å ha lagt til to partiske eksponenter, må skjevheten trekkes fra for å oppnå riktig resultat.

IEEE 754 bruker representasjonen med B = 127 for singel og B = 1023 for dobbel.

Tegn på nummeret

Tegnet v på et flytende nummer (+ eller -; også +1 eller −1) kan alltid kodes litt. Mesteparten av tiden brukes biten til positive tall (+) og biten til negative tall (-). Matematisk kan du skrive

Kort beskrivelse av parametrene

I de senere årene, følgende oppsummering av de viktigste parametrene har , , og et flyttall håndhevet. Her separat skriver størrelsene 1, etter punktene , , og videre i den rekkefølgen. 1 er antall tegnbiter. Et IEEE-754 enkelt nummer med 1 tegnbit, 8 eksponentbiter og 23 mantissabiter er derfor et flytende punktnummer på 1.8.23.127.2. Hvis basen og skjevheten kommer ut av sammenhengen, kan begge utelates, og man snakker om et flytende punktnummer på 1.8.23.

En annen vanlig notasjon utelater tegnbiten og spesifiserer bare lengden på mantissen og lengden på eksponenten: s23e8.

Med disse merknadene gjelder følgende for IEEE-754-numre:

half:   1.5.10.15.2,       1.5.10          oder s10e5
single: 1.8.23.127.2,      1.8.23          oder s23e8
double: 1.11.52.1023.2,    1.11.52         oder s52e11
quad:   1.15.112.16383.2,  1.15.16383      oder s112e15
oct:    1.19.236.262143.2, 1.19.236.262143 oder s236e19

Skjult bit

Når du viser normaliserte mantisser i det binære systemet , kan en bit lagres. Siden det første sifferet i et normalisert tall alltid ikke er lik 0, er dette sifferet alltid lik 1 i det binære systemet. Et siffer med den faste verdien 1 trenger ikke lenger lagres eksplisitt, som det er kjent implisitt. Når det implementeres, er det en skjult bit ( Engl. Bokstavelig talt "skjult bit snakket"). Det nevnte IEEE-formatet for flytende nummer bruker dette besparelsesalternativet, men ikke det interne 80-bits formatet til Intel-prosessorer.

Hvis for eksempel tallet 5.25 skal konverteres til et kort reelt (enkelt presisjonstall) i henhold til IEEE 754, flyttes kommaet to ganger til venstre etter det mellomliggende trinnet med binær konvertering til 101,01, slik at en standardisert binær representasjon med 1.0101e2 er gitt. På grunn av den skjulte biten blir bare sekvensen 0101 overtatt i den 23-sifrede mantissen. Bruken av en skjult bit krever imidlertid en separat representasjon av null, siden hver mantissa representerer en verdi større enn 0 på grunn av den skjulte biten.

Egenskaper for en flytende punkt-aritmetikk

Flytende tall kommer med noen overraskelser, spesielt for den matematiske lekmannen, som ofte påvirker resultatene av lommekalkulatorer og datamaskinberegninger. Viktigst er de vanlige matematiske reglene som er overstyrt. Alle som jobber intensivt med et beregningshjelpemiddel, må være kjent med disse egenskapene. De stammer fra den begrensede nøyaktigheten som mantissaen og eksponenten lagres med. Konsekvensen av denne begrensningen blir tydelig når du vurderer at de uendelig mange reelle tallene skal representeres av et endelig antall kombinasjoner av sifre. Flytende tall i domenet til et system kan betraktes som en lang tabell med diskrete verdier. En flytpunktsfunksjon tilordner deretter en annen verdi til hver verdi i denne listen. Det samme gjelder to- og flersifrede operasjoner. De tilsvarende verdiområdene vises grafisk i artikkelen Minifloats .

Dette resulterer i liten til absolutt unøyaktighet av beregningene og ugyldiggjorte gyldigheten av vanlige matematiske beregningsregler.

Utryddelse

Sletting er effekten at når du trekker fra tall av nesten samme størrelse, blir resultatet feil.

Eksempel:

Hvis du trekker fra og tallet 3.141 i en firesifret flytepunktsregning ( , ), forventer lekmann at resultatet blir avrundet riktig .

Faktisk er resultatet : Den firesifrede avrundede verdien av er , så resultatet av beregningen blir . Dette resultatet oppstår fordi utgangsvariablene, spesielt i flytende punkt-aritmetikk, allerede er vist og ikke akkurat er tilgjengelige.

Antall forskjellige størrelser (absorpsjon)

Tillegg eller subtraksjon av et tall som er mye mindre i størrelse endrer ikke det større tallet.

I eksemplet med firesifret desimalregning ( , ) endrer ikke tilsetning av 0,001 til 100 noe på større operand. Det samme gjelder for subtraksjon:

(Tallene bak linjen | er utelatt for skalering)

Lavere kurs

Siden det er et minste positivt tall i flytpunktsrepresentasjonen, under hvilken ingen verdi kan representeres, blir et resultat i dette området vanligvis representert med 0. I dette tilfellet snakker man om en understrøm. Hvis resultatet er et mellomresultat, har all informasjon om resultatet gått tapt på dette tidspunktet. I noen tilfeller påvirkes ikke nøyaktigheten av sluttresultatet, men i andre tilfeller kan det resulterende sluttresultatet være helt feil.

Ugyldighet av tilknytnings- og distribusjonslover

Tillegg og multiplikasjon av flytende punktum er ikke assosiative , det vil si generelt:

Tillegg og multiplikasjon av flytende punktum er heller ikke distribuerende , noe som generelt betyr:

Løselighet av ligninger

I flytende punkt-aritmetikk har noen normalt uløselige ligninger en løsning. Denne effekten brukes til og med for å beskrive et slikt flytende punkt-system.

Eksempel:

I feltet med reelle tall, ligningen for en løsning.

I flytende punktsaritmetikk har denne ligningen mange løsninger, nemlig alle tall som er for små til å ha noen innvirkning på summen. Igjen med eksemplet på firesifrede desimalbrøker ( , ) gjelder følgende (bindestrek | markerer stedene som er utelatt i tillegg):

  • 1 + 1e - 3 , 0= 1000 + 0,001 | 000000… = 1000 + 0,001 = 1,001> 1
  • 1 + 1e - 4 , 0= 1000 + 0,000 | 10000 ... 0= 1000 + 0,000 = 1000 = 1
  • 1 + 2,3e - 5 = 1000 + 0,000 | 023000 ... = 1000 + 0,000 = 1000 = 1

Det ovenfor nevnte minste tallet som kan legges til en og en etter en annen resultatforsyning ( ;  ! Minimal) kalt maskinens nøyaktighet .

Konverteringer

Hvis basen er annen enn 10, må tallene konverteres mellom det nåværende flytende punktsystemet og desimalsystemet for å oppnå en menneskelig lesbar representasjon. Dette programmeres vanligvis raskt (og ofte unøyaktig). Et allerede gammelt og viktig krav for denne konverteringen er dens bit-eksakte reversibilitet. Et resultat representert i desimalsystemet skal kunne leses inn igjen og gjengi den samme representasjonen i flytpunktsystemet med bitnøyaktighet.

Dette kravet blir ofte ikke tatt i betraktning. Et unntak fra dette er Java, som observerer følgende setning:

Teorem: Man kan vise at det ikke er tilstrekkelig å avrunde antall desimaler beregnet på grunnlag av mantissanøyaktigheten og å produsere disse desimalene avrundet. Imidlertid er det nok et siffer som er tilstrekkelig (setning 15). Dette er grunnen til at det alltid vises et ekstra og tilsynelatende overflødig sted i representasjonen av reelle tall som produseres av Java-programmer.

Desimalfraksjoner

Selv enkle desimalfraksjoner som 0.1 kan ikke representeres nøyaktig som binære flytende tall, siden hvert rasjonelle tall hvis forkortede nevner ikke er en styrke på to, fører til en ikke-avslutende, periodisk representasjon i det binære systemet. Bare de første sifrene i dette lagres, noe som resulterer i unøyaktighet. Desimal 0,1 er binært 0,0001100110011 ... For binære flytende punktssystemer med passende avrundingsregler er det imidlertid bevist at representasjonen av 0,1 multiplisert med 10 gir nøyaktig 1 igjen. Generelt, med riktig avrunding, (m / 10) · 10 = m (Goldbergs teorem 7 for det spesifikke tilfellet n = 2 1 + 2 3 = 10).

I fagområder som finansmatematikk kreves det ofte resultater som samsvarer nøyaktig med en manuell beregning. Dette er bare mulig med desimal flytende regning eller - med noen få "forvrengninger" - med fast punkt regning.

Sjekk for likeverd

Begrensningen nevnt i avsnittet om desimalfraksjoner at mange av disse desimaltallene ikke kan vises nøyaktig i det binære systemet til en datamaskin, har innvirkning på sammenligninger mellom flytende punktum ved programmering . Et eksempel på programmeringsspråket C bør avklare dette:

#include <stdio.h>
int main(void) {
 if (0.362 * 100.0 != 36.2)
  puts("verschieden");

 if (0.362 * 100.0 / 100.0 != 0.362)
  puts("auch verschieden");
 return 0;
}

Selv om de to ligningene er matematiske riktige, blir de feil på grunn av unøyaktig konvertering til datamaskinens binære system. I eksempelprogrammet anses begge ulikhetene derfor for å være sanne.

Sammenligninger må derfor erstattes av et spørsmål om verdiene som skal sammenlignes kan sees på som de samme innenfor rammen av en oppnåelig nøyaktighet (vanligvis kalt toleranse ).

Hvis man tolererer en absolutt feil i sammenligningen, er en mulig formulering .

Hvis man tolererer en relativ feil i sammenligningen, er en mulig formulering . Det andre tilfellet må vanligvis kobles til spørsmålet om spesielle tilfeller .

Alternativt kan alle faktorer eller summander inkludert det forventede resultatet av disse problematiske sammenligningene i tilfelle rasjonelle flytende tall også multipliseres med, med indeksen som indikerer siste desimal. Mer generelt: Alle flytende tall må - hvis mulig - konverteres til brøker. Disse kan igjen konverteres til det binære tallsystemet tydelig og uten å avrunde mantissen. Kompilatorer av noen programmeringsspråk (f.eks. Java , Ruby , C ++ , Objective-C , Swift , Rust , etc.) kan beregne direkte med brøkene og sammenligne brøkene i de ovennevnte betingede utsagnene (Hvis uttalelser), som ikke blir ført som et resultat blir. Andre programmeringsspråk (f.eks. Object Pascal , PHP , JavaScript , Perl , Python , etc.) konverterer i sin tur brøk eller kvotient tilbake til et binært tall som det aller første trinnet, og sammenlign deretter bare begge verdiene, som i dette saken gjør begge forhold oppfylt, og utgiftene som er angitt ovenfor blir gjort.

Selv tall med nøyaktig samme bitmønster og dermed faktisk nøyaktig identiske verdier blir noen ganger ikke ansett å være det samme av datamaskinen . Dette er forårsaket av noen ganger ikke identiske formater i minnet (f.eks. Intel 64 bit) og under en beregning i flytende punktenheten (f.eks. Intel 80 bit). Hvis de samme bitmønstrene som skal sammenlignes kommer en gang fra minnet og dermed avrundet og en gang fra FPU og dermed med full nøyaktighet, fører en sammenligning til feil resultat. Midlet er det samme som allerede beskrevet. Dette problemet kan også oppstå ved større / mindre sammenligninger, avhengig av språk og arkitektur som brukes, må spesielle kommandoer og / eller en omkjøring via hovedminnet tas for å løse dette.

Skjult bruk av andre representasjoner

Noen databehandlingssystemer bruker flere forskjellige formater når de beregner. Med Intel og relaterte prosessorer som AMD beregner FPU med et 80-biters format. Tallene lagres i et IEEE-754-kompatibelt 64-biters eller 32-biters format. Når du bruker MMX / SSE- utvidelser, brukes andre beregningsformater igjen. Dette fører til ytterligere egenskaper som i utgangspunktet er veldig ugjennomsiktige for lekfolk. En enkel sammenligning av identiske bitmønstre for likhet kan føre til at de tilsynelatende identiske bitmønstrene er forskjellige. Følgende program gir noen ganger paradoksale resultater når det kalles med samme verdi for x og y:

void vergleiche (double x, double y) {
 if(x != cos (y))
  printf("paradox\n");
 else
  printf("wuerde jeder so erwarten\n");
}
...
double z = 0.2; // der Wert ist nicht wichtig
vergleiche (cos (z), z);
 mit dem Ergebnis:  paradox 

Forklaringen på denne oppførselen er at kompilatoren genererer to uavhengige cos-beregninger, den ene før samtalen om å sammenligne , den andre i Sammenlign . Variabelen x mottar cos (z) med 64 bits. Hos Intel kan cos (y) beregnes med 80 bits; de to resultatene er forskjellige hvis cos (y) sammenlignes med 64-bits variabelen x ikke i minnet, men direkte fra 80-biters arbeidsregister.

Binære flytende tall i digital teknologi

Ovennevnte eksempler er alle gitt i desimalsystemet , dvs. med en base b  = 10. Datamaskiner bruker det binære systemet med en base b  = 2 i stedet .

Enkelt og dobbelt presisjon

Flyttall er normalt som sekvenser av 32 i datamaskiner  bit ( enkel presisjon , engelsk enkel presisjon ) og 64 bits ( dobbel presisjon , dobbel presisjon ) er vist.

Noen prosessorer tillater også lange flytende tall, så av de kjente prosessorer fra Intel - x86- serien, avledet (blant annet Intel .. Pentium og AMD Athlon ) en Gleitkommazahldarstellung med 80 bits for mellomliggende resultater. Noen systemer tillater også flytende tall med 128 bits ( firedobbelt presisjon ) . Noen eldre systemer brukte også andre lengder, for eksempel 36 bits ( IBM 704 , PDP-10 , UNIVAC 1100/2200-serien ), 48 bits (Burroughs) eller 60 bits ( CDC 6600 ),

I tillegg er det også systemer som kalles minifloats med svært få biter (rundt 8 eller 16) som brukes i systemer med lite minne ( kontrollere ) eller begrensede datastrømmer (f.eks. Grafikkort).

IEEE 754 og andre standarder

Det vanligste og mest kjente flytende punktsystemet i dag ble unnfanget av IEEE i 1985 , nedfelt i IEEE 754 , og er til stede i de fleste datamaskiner som maskinvare- eller programvarearitmetikk. IEEE 854 er en standard for desimaltall eller desimalbrøk med flytende punkt . Begge standardene slås sammen og utvides i IEEE 754r- revisjonen .

IEEE har regulert representasjonen av flytende punktum i sin IEEE 754-standard siden 1985; nesten alle moderne prosessorer følger denne standarden. Moteksempler oppfyller 754 ikke spesifikasjonene til IEEE, noen IBM - mainframe-systemer (Hexfloat-format), VAX- arkitekturen og noen superdatamaskiner som de fra Cray . Java- språket er tett basert på IEEE 754, men oppfyller ikke helt standarden.

Definisjonen av hex-float-formatet fra IBM finnes i boken "Principles of Operation" av z-arkitekturen .

Den Power6 fra IBM er en av de første prosessorer for å implementere desimal flytende punktet aritmetikk i maskinvare; basen er derfor 10. I det følgende behandles bare base 2.

Strengt tatt er bare de normaliserte tallene fra IEEE 754 flytende nummer. De denormaliserte tallene er faktisk faste punktnumre; disse spesielle tilfellene ble opprettet for spesielle numeriske formål.

Intern representasjon

Den faktiske representasjonen i datamaskinen består derfor av en tegnbit, noen eksponentbiter og noen mantissabiter. Ved hvilken mantissa stort sett normaliseres og tall i intervallet [1; 2 [representerer. (Siden den første biten med verdien en alltid er satt i dette intervallet , antas den vanligvis implisitt og ikke lagres, se Hidden Bit ). Eksponenten vises vanligvis i skjevt format, eller i komplement fra to . Videre, for å representere spesielle verdier (null, uendelig, ingen tall), forbeholdes vanligvis noen eksponentverdier, for eksempel størst mulig og minst mulig eksponent.

Et tall f representeres derfor som f = s · m · 2 e , hvor s er 1 eller −1.

IEEE 754 S / 390
Mantissa (i biter) Eksponent (i bit) Mantissa (i biter) Eksponent (i bit)
Hjalp 10 5
enkelt 23 8. plass 24 7.
Dobbelt 52 11 56 7.
Forlenget ikke akkurat definert 112 7.

Begrensninger og deres matematiske grunnleggende

Den forskjellige binære representasjonen av tallene kan føre til gjenstander i begge systemene. Det betyr: Rasjonelle tall som for eksempel vises "runde" i desimalsystemet , kan ikke vises nøyaktig i det binære systemet (verdien er ). I stedet er deres binære representasjon avrundet innenfor omfanget av den respektive beregningsnøyaktigheten, slik at når du konverterer tilbake til desimalsystemet, f.eks. B. mottar verdien 12.44999999900468785. Dette kan føre til uforutsette avrunding opp eller ned i senere beregninger.

Gjenstandene nevnt ovenfor er uunngåelige i det binære systemet, siden et uendelig antall tall som kan representeres nøyaktig i desimalsystemet, er periodiske tall i det binære systemet med et uendelig antall desimaler. De kunne bare unngås ved å bruke kodinger med base 10 (eller andre baser av skjemaet med noen ), se også BCD-kode . Imidlertid brukes binære flytende tall fortsatt av en rekke årsaker.

Generelt er det et uendelig antall rasjonelle tall for hver base d , som har en endelig representasjon (0-periode) for en annen base og en uendelig representasjon med en periode for base d . Det eneste kjennetegnet ved desimalsystemet her er at folk er vant til det, og derfor er desimalsystemet ofte foretrukket for input og output format på fakturaer.

I matematikk er et flytende talltallsystem en tuple , som representerer basen, eksponentens rekkevidde og mantissas lengde.

Dermed kan et reelt tall x ≠ 0 representeres av a og e , slik at: og med .

Dette muliggjør en matematisk vurdering av avrundingsfeilen. Ovennevnte representasjon realiserer en projeksjon

og så er avrundingsfeilen definert som

For doble verdier er til og med lik (omtrent ).

Eksempel: Beregning av flytende nummer

18.4 10 skal konverteres til et flytende nummer, vi bruker den enkle IEEE-standarden (IEEE 754, binary32).

1. Beregning av overskudd

(Overskuddet eller skjevheten er en konstant som hører til tallstandarden. For dette formålet teller bitene som er reservert for eksponenten i antall representasjon, dvs. 8 sifre i IEEE 754-standarden.)

Exzess = 2(n-1) - 1
           (n Bits des Exponenten in der Zahlendarstellung)
       = 2(8-1) - 1
       = (27) - 1
       = 128 - 1
       = 127

2. Konvertering av en desimalbrøk til et dobbelt fast punktnummer uten tegn

Gleitkommazahl = 18,4
Vorkommaanteil = 18
 18 / 2 = 9 Rest 0 (Least-Significant Bit)
  9 / 2 = 4 Rest 1
  4 / 2 = 2 Rest 0
  2 / 2 = 1 Rest 0
  1 / 2 = 0 Rest 1 (Most-Significant-Bit)
   = 10010
Nachkommaanteil = 0.4
 0,4 * 2 = 0,8 → 0 (Most-Significant-Bit)
 0,8 * 2 = 1,6 → 1
 0,6 * 2 = 1,2 → 1
 0,2 * 2 = 0,4 → 0
 0,4 * 2 = 0,8 → 0
 0,8 * 2 = 1,6 → 1 (Least-Significant-Bit)
    •
    •
    •
     = 0,0110011001100110011...
18,4 = 10010,011001100110011...

3. Normaliser

10010,01100110011... * 2^0 = 1,001001100110011... * 2^4

4. Beregning av den dobbelte eksponenten

da 2^4 → Exponent = 4
Exponent + Exzess
   4 + 127 = 131
131/2 = 65 Rest 1 (Least-Significant-Bit)
 65/2 = 32 Rest 1
 32/2 = 16 Rest 0
 16/2 = 8  Rest 0
  8/2 = 4  Rest 0
  4/2 = 2  Rest 0
  2/2 = 1  Rest 0
  1/2 = 0  Rest 1 (Most-Significant-Bit)
   = 10000011

5. Bestem skiltbiten

Tegnet beregnes ut fra formelen (-1) ^ s:

 positiv → 0
 negativ → 1
   = 0

6. Dann flytnummer

1 Bit Vorzeichen + 8 Bit Exponent + 23 Bit Mantisse
0 10000011 00100110011001100110011
  → die Vorkomma-Eins wird als Hidden Bit weggelassen;
    da dort immer eine 1 steht,
    braucht man diese nicht zu speichern

Beregning av et IEEE- nummer med flytende punkt (32-bits flytpunkt)

Her presenteres de nøyaktige beregningstrinnene for å konvertere en desimalbrøk til et binært flytpunktnummer av typen singel i henhold til IEEE 754. For å gjøre dette må de tre verdiene ( tegn (1 bit), mantissa og eksponent ) som utgjør tallet beregnes etter hverandre :

skilt

Avhengig av om tallet er positivt eller negativt, er det 0 eller 1: eller

Alle videre beregninger gjøres med mengden av tallet.

eksponent

Deretter lagres eksponenten. Med den enkle datatypen IEEE er det gitt 8 bits for dette. Eksponenten må velges slik at mantissen har en verdi mellom 1 og 2:

Hvis resultatet er en verdi for eksponenten som er mindre enn −126 eller større enn 127, kan ikke tallet lagres med denne datatypen. I stedet lagres tallet som 0 (null) eller som "uendelig".

Verdien for eksponenten lagres imidlertid ikke direkte, men økes med en forspenningsverdi for å unngå negative verdier. Med IEEE single er forspenningsverdien 127. Dette betyr at eksponentverdiene −126 ... + 127 lagres som såkalte "egenskaper" mellom 1 ... 254. Verdiene 0 og 255 som egenskaper er reservert for de spesielle numeriske verdiene " Null ", " Uendelig " og " NaN ".

mantissa

Mantissaen er nå lagret i de resterende 23 bitene:

Numerisk eksempel med tallet 11.25

Antall = +11,25

Sign = + → 0 binær

→ 3 + 127 = 130 → 10000010 binært

→ 01101000000000000000000 binær

Dette resulterer i følgende flytende punktnummer med ett presisjon:

0 10000010 01101000000000000000000

reversering

Hvis du vil beregne et desimaltall fra et flytende nummer i maskinordet (32 bit), kan du gjøre dette veldig raskt med følgende formel:

Beregning av et IEEE- flytende punktnummer med dobbelt presisjon (64-biters flytnummer)

Tilbakeføring:

Følgende formel kan brukes til å beregne et desimaltall fra et flytende nummer i maskinordet (64 bit):

Eksempel:

Følgende 64-biters binære tall skal tolkes som et flytende nummer:

0 10001110100 0000101001000111101011101111111011000101001101001001

(den venstre biten er bit 63 og den høyre biten er bit 0)

Bit 63 representerer tegnet (1 bit), dvs.

  VZ = 0binär = 0

Bit 62 til 52 representerer eksponenten (11 bits), så:

 E = 10001110100binär = 1140

Bit 51 til 0 representerer mantissaen (52 bits), dvs.

  M = 0000101001000111101011101111111011000101001101001001binär = 

Settes inn i formelen resulterer i resultatet (avrundingsverdier):

 

Merknader

  1. Nemlig alle rasjonale tall som kan representeres med en kraft av ti som evner, men ikke med en effekt på to.

Se også

weblenker

Wiktionary: Floating point number  - forklaringer på betydninger, ordets opprinnelse, synonymer, oversettelser
Wiktionary: Floating point number  - forklaringer på betydninger, ordets opprinnelse, synonymer, oversettelser

Individuelle bevis

  1. ^ Otto Neugebauer : De eksakte vitenskapene i antikken. Princeton University Press, 1952.
  2. Bartel Leendert van der Waerden : Vitenskapelig oppvåkning. P. Noordhoff, Groningen, 1954.
  3. ^ Donald E. Knuth : Gamle babylonske algoritmer. I: Commun. ACM. 15, 1972, s. 671-677, Corr. In Commun. ACM. 19, 1976, s. 108.
  4. ^ Donald E. Knuth : Kunsten å dataprogrammering . Vol.2 : Seminumerical Algorithms. 3. Utgave. Addison-Wesley, 1997, s.196.
  5. ^ A b David Goldberg: Hva enhver dataloger bør vite om flytepunktsaritmetikk . I: ACM Computing Surveys . teip 23 , 1991, s. 5-48 , doi : 10.1145 / 103162.103163 ( sun.com [åpnet 2. september 2010]).
  6. Generell desimalaritmetikk. IBM Corporation
  7. ^ Prinsipper for drift. (PDF; 4,7 MB) 2. utgave. IBM Corporation, 2001, kapittel 19-4