Flydende komma – repræsentation af reelle tal i computere

Lær hvordan computere repræsenterer reelle tal med flydende komma i binær form — eksponent, mantisse, præcision og begrænsninger forklaret enkelt.

Forfatter: Leandro Alegsa

Reelle tal i binære tal skal lagres på en særlig måde i en computer. Computere repræsenterer tal som binære hele tal (hele tal, der er potenser af to), så der er ingen direkte måde for dem at repræsentere ikke-integrale tal som decimaltal på, da der ikke er noget radixpunkt. En måde, hvorpå computere kan omgå dette problem, er ved at repræsentere flydende punkt, hvor "flydende" henviser til, at radixpunktet kan flyttes højere eller lavere, når det ganges med en eksponent (potens).

Grundidé

Flydende komma (floating point) repræsenterer et reelt tal ved tre dele:

  • tegn (sign) — om tallet er positivt eller negativt;
  • signifikand (også kaldet mantissa eller fraction) — de væsentlige cifre i tallet;
  • eksponent — styrer hvor radixpunktet ligger ved at gange med en potens af to.

Matematisk kan værdien beskrives som: værdi = (-1)tegn × (1.signifikand) × 2^(eksponent − bias) for normaliserede tal. Bias er et fast tal, som bruges til at gemme både positive og negative eksponenter i et felt med kun positive bitmønstre.

IEEE 754 — den mest udbredte standard

De fleste moderne sprog og platforme følger IEEE 754-standarden for flydende punkt. De to mest almindelige formater er:

  • single precision (32 bit): 1 bit tegn, 8 bit eksponent, 23 bit signifikand. Bias = 127.
  • double precision (64 bit): 1 bit tegn, 11 bit eksponent, 52 bit signifikand. Bias = 1023.

I normaliserede tal antages der en implicit førende 1 foran signifikanden (deraf 1.signifikand i formlen). Når eksponentfeltet er alle nuller, kan tal være denormaliserede (subnormale), hvilket giver gradvis underflow tæt på nul.

Særlige værdier

  • Eksponentfeltet med alle 1'ere bruges til (uendelig) og NaN (Not a Number) — fx som resultat af 1/0 eller 0/0.
  • Positiv og negativ nul findes begge som gyldige repræsentationer (forskellen er normalt kun relevant i visse matematiske situationer).
  • Denormaliserede tal gør det muligt at repræsentere tal tættere på nul end normaliserede formater kan og giver «gradvis underflow».

Begrænsninger og fejlkilder

  • Præcision: Et flydende tal har kun et begrænset antal signifikante bits. Mange decimaltal (fx 0,1) kan ikke repræsenteres nøjagtigt i binært format, hvilket giver små afrundingsfejl.
  • Rundingsmetoder: Standard er normalt «round to nearest, ties to even», men andre metoder findes.
  • Associativitet brydes: (a + b) + c kan give et andet resultat end a + (b + c) pga. afrunding; man kan derfor ikke altid regne med sædvanlige algebraiske identiteter i numerisk kode.
  • Overflow og underflow: Yderst store tal giver overflow til ±∞, meget små tal kan miste præcision eller blive nul.

Praktiske råd

  • Brug passende præcision: double fremfor float når du har brug for mere nøjagtighed.
  • Undgå direkte sammenligning af flydende tal — brug et lille epsilon til at teste lighed.
  • For finansielle beregninger hvor decimaleksakthed er vigtig, overvej decimal-typer eller faste punkt (fixed-point) i stedet for binære floating-point.
  • Sortér additioner fra mindste til største for at reducere tab af præcision ved sum af mange tal.

Eksempel

Et simpelt eksempel: 6,5 i binært er 110,1. Som flydende punkt kan man skrive 6,5 = 1.101 × 2^2. I et enkelt præcisionsformat bliver tegn=0, eksponent=2+bias (127) = 129, og signifikand gemmer de binære cifre efter komma: 101000... osv.

Samlet set gør flydende punkt det muligt at repræsentere meget store og meget små reelle tal effektivt på computere, men man må være opmærksom på begrænsninger i præcision, særlige værdier og afrundingsadfærd for at undgå numeriske fejl i programmer.

Oversigt

I matematik og videnskab bliver meget store og meget små tal ofte gjort enklere og ganget med en tiendedel for at gøre dem lettere at forstå. Det kan f.eks. være meget nemmere at læse 1,2 billioner som {\displaystyle 1.2\times 10^{12}} end 1 200 000 000 000 000. Dette kan også bruges med negative ti-puder til at lave små tal, hvilket betyder, at du kan repræsentere 0,000001 som {\displaystyle 1\times 10^{-6}}. Denne fremgangsmåde kaldes videnskabelig notation.

Da computere er begrænset til hele tal og binære tal, betyder det, at de ikke uden videre kan repræsentere decimale brøkregningstal. For at kunne repræsentere brøkregningstal bruger computere tre sæt binære tal til at lave en videnskabelig notationsrepræsentation. De er: den signerede bit, som bestemmer, om tallet er positivt (0) eller negativt (1); signifikanten, som er en heltal (hel) version af tallet; og eksponenten, som er den potens, du multiplicerer basen med.

Betydning og

Signifikanten findes ved at tage dit tal og flytte radixpunktet, indtil der ikke længere er nogen brøkdel, hvilket gør det til et heltal. I decimaltal er dette at gøre 1,45 til 145 ved at flytte punktet 2 trin til højre, og i binærtal er dette at gøre 1101,0111 (13,4375) til 1101 0111 (215) ved at flytte punktet 4 trin til højre; i begge tilfælde er disse tal ikke relateret til hinanden ud over at bruge de samme cifre i en lignende rækkefølge.

På samme måde som videnskabelig notation gør signifikanten så grundlæggende som muligt, er målet med flydende punkttal at gøre den til et helt tal, så den kan repræsenteres i bytes og bruges i beregninger.

Exponent

Eksponenten er det antal cifre, som radixpunktet har bevæget sig forbi: hvis det bevæger sig til venstre, er eksponenten negativ, men hvis det bevæger sig til højre, er den positiv. Som ovenfor kræver det at gøre 1,45 til 145, at du ganger med 100, så eksponenten er 2, da {\displaystyle 100=10^{2}}. På samme måde kræver det at gøre 1101.0111 (13.4375) til 1101 0111 (215), at radixpunktet flyttes fire kolonner til højre, så eksponenten er 4. Dette kan verificeres i decimaltal som {\displaystyle 215\div 13.4375=16(2^{4})} .

Da processen er omvendt i de fleste tilfælde af videnskabelig notation, da det drejer sig om at gøre en brøk til et heltal i stedet for at gøre et stort heltal til en brøk, er eksponenter generelt negative for at flytte decimalpladsen til venstre; i decimal ville dette være at gøre dit heltal 145 tilbage til brøkstallet 1,45 ved at gange det med {\displaystyle 10^{-2}}. I stedet for at bruge en signeret bit længst til venstre er eksponenten i stedet forspændt, hvilket giver 32-bit floateksponenterne et interval på {\displaystyle 2^{-126}} til {\displaystyle 2^{127}}. Udgangsværdien af den skæve eksponent kan findes ved at lægge 127 til den:

{\displaystyle b^{5}=132(5+127)=10000100}

{\displaystyle b^{-5}=122(-5+127)=01111010}

{\displaystyle b^{0}=127(0+127)=01111111}



 

Eksempel

Decimal til Bicimal

Lad os f.eks. antage, at vi ønsker at repræsentere decimaltallet 37,40625 til dets binære modstykke: et bikimaltal (eller binært decimaltal/brøk). Først skal vi tage vores decimaltal, som er i potenser af 10, og konvertere det til binært tal, som er i potenser af 2. En måde at gøre dette på er at trække den størst mulige potens af to fra, indtil man når nul:

{\displaystyle 37.40625-\mathbf {32} (2^{5})=5.40625}

{\displaystyle 5.40625-\mathbf {4} (2^{2})=1.40625}

{\displaystyle 1.40625-\mathbf {1} (2^{0})=0.40625}

{\displaystyle 0.40625-\mathbf {0.25} (2^{-2})=0.15625}

{\displaystyle 0.15625-\mathbf {0.125} (2^{-3})=0.03125}

{\displaystyle 0.03125-\mathbf {0.03125} (2^{-5})=0}

Ved hjælp af ovenstående potenser af to kan vi repræsentere vores decimaltal {\displaystyle 37.40625} på følgende måde:

Strøm:

{\displaystyle 2^{5}}

{\displaystyle 2^{4}}

{\displaystyle 2^{3}}

{\displaystyle 2^{2}}

{\displaystyle 2^{1}}

{\displaystyle 2^{0}}

-

{\displaystyle 2^{-1}}

{\displaystyle 2^{-2}}

{\displaystyle 2^{-3}}

{\displaystyle 2^{-4}}

{\displaystyle 2^{-5}}

Værdi:

1

0

0

1

0

1

-

0

1

1

0

1

Bicimal til Float

Vi har bekræftet, at vores decimaltal {\displaystyle 37.40625} er repræsenteret i binær form som {\displaystyle 100101.01101} . Problemet med computere er imidlertid, at de repræsenterer tal som hele potenser af to ved hjælp af bits, hvilket gør brøk- og negative tal kompliceret. I overensstemmelse med IEEE-754 er den måde, hvorpå dette normalt gøres på en computer, at oprette et 32-bits floating point-tal, der består af tre dele: tegnet, 1 bit til at bestemme, om vores tal er positivt eller negativt; eksponenten, 8 bits til at repræsentere vores eksponent, og som vi lægger 127 til for at undgå signerede bytes; og vores signifikant, som er vores binære tal uden et bikimalpunkt fordelt på 23 bits. Da vi skal flytte vores bicimalpunkt 5 steder for at gøre {\displaystyle 100100.01101} til signifikanten {\displaystyle 10010001101} er vores eksponent {\displaystyle 132(5+127)} . Ved at bruge en 32-bit float kan vi repræsentere 37,40625 på denne måde:

Type:

±

Exponent

Betydning og

Værdi:

0

1

0

0

0

0

1

0

0

0

0

1

0

1

0

1

1

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

Betydning:

+

{\displaystyle 2^{7}+2^{2}=132}

{\displaystyle 2^{20}+2^{18}+2^{16}+2^{15}+2^{13}=1,417,216}



 

Relaterede sider

 

Spørgsmål og svar

Spørgsmål: Hvad er reelle tal?


A: Reelle tal er alle tal, der kan udtrykkes som decimaltal, herunder brøker og irrationelle tal.

Spørgsmål: Hvordan lagrer computere binære tal?


Svar: Computere lagrer binære tal som binære heltal, som er hele tal, der er potenser af to.

Spørgsmål: Er der en direkte måde, hvorpå computere kan repræsentere ikke-tallige tal som decimaltal?


A: Nej, der er ingen direkte måde for computere at repræsentere ikke-tallige tal som decimaltal på, fordi der ikke findes noget radixpunkt.

Sp: Hvad er formålet med repræsentation af flydende kommaer?


Svar: Frivolpunktsrepræsentation gør det muligt for computere at omgå problemet med manglende radixpunkt ved at lade radixpunktet bevæge sig højere eller lavere, når det ganges med en eksponent (potens).

Spørgsmål: Hvad betyder "floating" i floating-point-repræsentation?


Svar: Udtrykket "flydende" henviser til, at radixpunktet kan bevæge sig højere eller lavere, når det ganges med en eksponent (potens).

Spørgsmål: Hvordan beregner man en eksponent (potens)?


Svar: En eksponent (potens) beregnes ved at multiplicere et grundtal med sig selv et bestemt antal gange. F.eks. 2^3 = 8, fordi 2 x 2 x 2 x 2 = 8.


Søge
AlegsaOnline.com - 2020 / 2025 - License CC3