Flyttal

Flyttal är en approximerad datorrepresentation av reella tal.

Ett normaliserat flyttal består av tecken (plus eller minus, vanligtvis representerat med en bit) en mantissa (även kallad taldel) och en exponent (även kallad karakteristika), och kan skrivas som:

där är tecknet () är mantissan (som är minst 1 men mindre än ) är basen (vanligen 2 eller 10, men även 16 förekommer) och exponenten.

Alternativt låter man mantissan vara mellan och 1, vilket ger en exponent som är ett större. Då exponentens värde är begränsat, kan inte 0 representeras på detta sätt. Vanligen använder man för 0 minsta möjliga exponent samt låter mantissan vara 0. En generalisering av representationen för 0 är de subnormala talen, som är nära 0 och fyller det så kallade underflödesgapet med fler tal än bara 0. Dessutom finns, numera, representationer för +∞ och −∞, "indefinite" (obestämt), samt NaN (inte-ett-tal, Not a number).[1][2]

De flyttal en dator kan räkna med består av ett begränsat antal bitar, därför har mantissan en begränsad noggrannhet (upplösning) och exponenten (som är ett positivt eller negativt heltal) en begränsad storlek.

Namnet flyttal kommer sig av att radixpunkten i ett flyttal är rörlig det vill säga "flyter": det som är bestämt i ett flyttal är vilka bitar som är exponent och mantissa samt tecken, medan det i fixpunktsaritmetik är bestämt vilka bitar som utgör heltalsdel och bråkdel av ett tal.

På grund av den begränsade noggrannheten måste avrundningar göras, och därmed följer flyttal i allmänhet inte de matematiska reglerna associativitet och distributivitet, vilka gäller för reella tal. Vetenskapen om numeriska metoder går delvis ut på att formulera om beräkningar så att felen minimeras.

Standard

År 1949 beskrev Gösta Neovius för första gången flyttal på svenska, i en beskrivning av flyttalsenheten i den svenska datorn BARK. Han använde emellertid inte ordet "flyttal" som ännu inte uppfunnits utan beskrev funktionen av en flyttalsmultiplikator med 32 bitar varav 24 bitar och en teckenbit för mantissa samt 6 bitar och en teckenbit för exponent. Denna representation var inspirerad av amerikanska datorer men ingen standard.[3]

Fram till 1985 saknades en standard för datorrepresentation av binära flyttal. Ett förslag till standard lades fram av IEEE år 1979 och antogs 1985.[2] Denna standard fick namnet IEEE 754. Denna standard följs av nästan alla moderna datorer. Några undantag är IBM:s stordatorer, som har stöd för hexadecimala flyttal och IEEE 754, Crays vektormaskiner, där T90-serien hade IEEE-flyttal, medan SV1 fortfarande använder Crays eget flyttalsformat, och VAX-systemen som hade sitt eget flyttalsformat. Dessa, och många andra, flyttalssystem gjordes innan första versionen av IEEE 754, och ett fåtal finns kvar av bakåtkompatibilitetsskäl.

Första versionen av IEEE 754 beskrev två olika flyttalsformat, så kallade single precision- och double precision-flyttal, samt tillät extended precision för vardera.[2]

IEEE 754 fick en andra version 2008. Den nya versionen specificerar fem flyttalsformat för beräkningar: binary32 (f.d. single precision), binary64 (f.d. double precision), binary128, samt decimal64 och decimal128. Som namnen antyder har de två sistnämnda bas 10. Den specificerar dessutom två format för lagring av mindre precisa tal, binary16 och decimal32, och tillåter dessutom extended precision både för binära och decimala flyttal.

Partitioneringen av flyttal enligt IEEE 754 är som följer:

TypTeckenExponentMantissaTotalt antal bitarExponentoffsetAntal bitars precisionAntal decimalsiffror
Halv precision (IEEE 754-2008)1510161511~3.3
Enkel precision18233212724~7.2
Dubbel precision1115264102353~15.9
x86 utökad precision11564801638364~19.2
Kvadrupel precision11511212816383113~34.0

Exponenten kan vara såväl positiv som negativ, men i binära format så lagras denna som ett tal utan tecken (unsigned) med en förutbestämd offset (bias) som alltid läggs till. En lägsta exponenten är alltså 0 men detta representerar ett negativt tal. Värde med bara nollor är reserverade för att representera nollor och icke-normaliserade tal, och värden med bara ettor är reserverade för att representera oändligheter, obestämda talvärden och icke-tal (NaN). Exponentspannet för normaliserade tal är [-126, 127] för enkel precision, [-1022, 1023] för dubbel precision respektive [-16382, 16383] för kvadrupel precision.

Ett exempel på layout av ett 32-bitars flyttal med enkel precision är följande:

I exemplet är sign tecknet (plus/minus), och fraction är mantissan.

Användning

Flyttal används främst i numeriska datortillämpningar där man behöver representera verkliga eller simulerade fysikaliska värden som avstånd, tidsintervall, temperaturer och liknande. Vanliga användningsområden är vetenskapliga numeriska program, datorbaserad simulering och datorspel.

På grund av avrundningsfelen som flyttalen alltid är behäftade med är de direkt olämpliga för affärssystemsberäkningar. Istället använder man datatyper som är bättre lämpade för finansiella kalkyler.

Referenser

  1. ^ Pohl, Peter (2005). ”1:1 Ofta använda datorbegrepp”. Grundkurs i numeriska metoder. Stockholm: Liber. sid. 4. ISBN 91-47-05292-9 
  2. ^ [a b c] Eldén, Lars; Linde Wittmeyer-Koch (2001). ”2. Felanalys och datoraritmetik”. Numeriska beräkningar - analys och illustrationer med MATLAB. Lund: Studentlitteratur. ISBN 91-44-02007-4 
  3. ^ Neovius, Gösta (1949). ”Den aritmetiska enheten i en matematikmaskin”. Svenska Fysikerförbundets publikation Kosmos (Svenska Fysikerförbundet): sid. 47-67. ISSN 0368-6213. Läst 30 april 2021.  Libris 8262138

Media som används på denna webbplats

Float example.svg
Författare/Upphovsman: Vektorisering: Stannered, Licens: CC BY-SA 3.0
Binary representation of a 32-bit floating-point number. The value depicted, 0.15625, occupies 4 bytes of memory: 00111110 00100000 00000000 00000000