Reelle tall er alle tall som kan markeres på tallinjen. Artikkelen viser hvordan en kan lagre reelle tall med binære sifre, altså i to-tallsystemet.  

Representasjon – hvordan tallene er lagret digitalt – har betydning for hvilket verdiområde som dekkes, hvilken nøyaktighet som oppnås, og hvordan data kan utveksles mellom maskiner. Omforming til forskjellige lagringsformater kalles konvertering.

I noen beregninger kan det være nødvendig å lagre mellomresultat med større nøyaktighet enn i sluttsvaret. Gjentatte avrundingsfeil kan summere seg opp til en feil som blir stor nok til å ha betydning.

datamaskiner er lagringsmetoden for reelle tall mer kompleks enn for heltall

Kommatall kan lagres som skalerte heltall, det vil si at det lagrer verdien multiplisert med en skaleringsfaktor, som regel er det en potens av 10 - (10, 100, 1000, ...) eller 2 (2, 4, 8, 16, ...). Eksempel: Vekten måles i kg med en nøyaktighet på 0,010 kg. For å lagre vekten som heltall kan en skalere opp vekten med 100 slik at noe som veier for eksempel 3,25 kg lagres som 325. 

Når en mulipliserer skalerte tall for eksempel \(3,75 \times 2,55 = 9,5625\) vil kommaet i resultatet "flytte" seg. I eksemplet er det to desimaler bak komma i de to operandene, men det er 4 desimaler bak komma i resultatet. Hvis en vil at alle heltall skal ha to desimaler bak komma må en skalere resultatet ved å dele på 100, slik at en lagrer 9,56 i stedet for 9,5625. En mister nøyaktighet i resultatet.

Denne måten å lagre tall på kalles «fixed point representation» på engelsk. Engelsk bruker desimalt punktum, på norsk har vi desimalt komma. Variable (i programmeringsspråk) som skal lagre kommatall som heltall får oppgitt hvor mange siffer (desimale eller digitale) de skal ha etter det fiktive kommaet. 

Fast kommarepresentasjon er særlig aktuelt på maskiner som ikke har instruksjoner for flytende kommarepresentasjon (eng.: floating point arithmetic). Ulempen ved metoden er begrenset verdiområde og tap av nøyaktighet for mange operasjoner. 

Metoden utnytter alle bit for å oppnå stor nøyaktighet i et stort verdiområde. Tall lagres som et produkt av en mantisse  \(m\) og en potens av to. Første bit i dataordet - \(s\) brukes til fortegn: \(t = s \times m \times 2^e \). \(m\) er et tall større eller lik 1 og mindre enn 2. Eksponenten \(e\) kan ta både positive og negative verdier.

Mantissen er alltid et tall \(1 \le m < 2 \). Digitalt representeres det slik når mantissen har \(n\) siffer etter komma: 

\( m= 1+\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+ \cdots + \frac{1}{2^n} \)

Verdien 1 inngår alltid og den trenger ingen bit for lagring. Kommaet står mellom 1 og summen av brøker. For å representere \(m\) trenger vi 1 bit for hver brøkenhet. Vekten for hver bitposisjon blir som vist i tabellen under. På siste linje er det vist hvordan tallet 0,8125 er skrevet som binærtall.

\( \begin{array}{rccccc cccc} \texttt{bit}&1& 2& 3& 4& 5& 6& 7& 8& 9\\ \texttt{vekt}&\frac{1}{2^1}&\frac{1}{2^2}&\frac{1}{2^3}&\frac{1}{2^4} &\frac{1}{2^5} &\frac{1}{2^6} &\frac{1}{2^7}   &\frac{1}{2^8}  &\frac{1}{2^9}\\  \texttt{ } &\frac{1}{2}  &\frac{1}{4} & \frac{1}{8}  & \frac{1}{16}  & \frac{1}{32}  & \frac{1}{64}       &\frac{1}{128}  &  \frac{1}{256}  & \frac{1}{512}  \\  0,8125   =  & 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \end{array} \)

I dataord med 32 bit er det normalt å avsette de 23 minst signifikante bit til mantisse. Det kan lagre reelle tall med en nøyaktighet på 7 desimale sifre.

bestemmer størrelsen på verdiområdet som kan dekkes. Det er normalt at eksponenten er «biased». Det betyr at en mellomverdi, vanligvis den i midten, tolkes som 0. For et 32 bit dataord er det normalt satt av 8 bit til eksponent, som da kan ta verdier mellom 0 og 255. Med base 127=0 kan eksponenten ta verdier fra -126 til 127. Det betyr at representasjonen kan dekke et tallområde fra \(\frac{1}{2^{126}} \approx 1,17549 \times 10^{-38}\) til nesten \(2^{128} \approx 3,40282 \times 10^{38} \). 

Alle tall blir normalisert, det betyr at mantissen får en verdi i intervallet \( [1\texttt{ til }2>\). Lettest kan vi illustrere dette ved å skrive et kommatall på binær form:

\( \begin{array}{lcl} 1100,111& \Longrightarrow & 1,100111 \times 2^3\\ 8+4+0+0+\frac{1}{2}+\frac{1}{4}+\frac{1}{8}& \equiv & (1+\frac{1}{2}+0+0+\frac{1}{16}+\frac{1}{32}+\frac{1}{64})\times 8\\&=& 8+4+0+0+\frac{1}{2}+\frac{1}{4}+\frac{1}{8} \end{array} \)

Flytting av kommaposisjonen under normaliseringen gjør at representasjonen kalles floating point numbers – flytende kommarepresentasjon. I daglig tale brukes også betegnelsen flyttall.

Lagring av reelle tall er standardisert i IEEEs standard 754. De fleste maskinleverandører følger standarden. Standarden dekker representasjoner med 16, 32, 64, 128 og 256 bit. 

Plasseringen av mantisse, eksponent og fortegn i dataordet betyr at de vanlige instruksjonene for å teste på «større enn» og «mindre enn» kan brukes også for denne lagringsformen for reelle tall. 

Foreslå endringer i tekst

Foreslå bilder til artikkelen

Kommentarer

Har du spørsmål om eller kommentarer til artikkelen?

Kommentaren din vil bli publisert under artikkelen, og fagansvarlig eller redaktør vil svare når de har mulighet.

Du må være logget inn for å kommentere.