Most recent comments
Liveblogg nyttårsaften 2017
Tor, 11 months, 3 weeks
Jogging og blogging
Are, 1 year, 11 months
Liveblogg nyttårsaften 2016
Are, 1 year, 11 months
Reading in dark times
Are, 2 years, 1 month
Moldejazz 2016
Camilla, 2 years, 4 months
Dørskilt
Karoline, 2 years, 5 months
Halifax
Tor, 2 years, 6 months
Sony Smartwatch 3 review
Tor, 2 years, 6 months
Numerikk, takk
Tor, 2 years, 6 months
Topp tur
Camilla, 2 years, 8 months
50 book challenge
Camilla, 11 months, 3 weeks
Ten years ago
Musikklinjas julekonsert 2008
Camilla
Controls
Register

One double precision to go, please

Det er vanlig å si at datamaskiner bare gjør det du ber dem om, så om den ikke gjør det du vil er det din egen feil. Det ligger mye god visdom i dette, men det er dessverre ikke alltid riktig. Det er nemlig ikke alltid en datamaskin gjør det du ber den om, eller i allefall ikke det du tilsynelatende ber den om. Jeg fikk en irriterende påminnelse om dette denne helgen, da jeg ba en datamaskin om å regne ut et par hundre ledd i en rekkeutvikling av eksponentialfunksjonen av et stort tall.

Jeg tenkte å holde meg til de tekniske detaljene, så de matematiske detaljene glatter jeg litt over. Det jeg ville var essensielt å legge sammen en rekke tall, der noen er veldig store, og noen er veldig små. Det høres jo ut som en grei sak, men det trenger det ikke være, og nøkkelen til å forstå om dette går bra eller ikke ligger i hvordan datamaskinen representerer tall.

I dette tilfellet brukte jeg det som kalles dobbel presisjon. Det innebærer typisk at maskinen setter til side 8 bytes, altså 64 bits, til å lagre ett tall. Av disse bitsene er 1 brukt til å holde fortegnet, altså om tallet er positivt eller negativt, 11 er satt til side til å holde eksponenten i en potens av 2 som tallet skal ganges med, og de resterende 52 bitsene brukes til selve tallet, i en litt sær binær representasjon. Essensen er i allefall at man kan representere tall mellom -1.7976931348623157 x 10308 og 1.7976931348623157 x 10308, med mellom 15 og 17 gjeldende siffer.

Datamaskiner opererer med andre ord ikke med perfekt presisjon. Det sier seg naturligvis selv at man ikke kan ha uendelig god presisjon, siden man har endelig med minne, men jeg er ikke sikker på at jeg for fire-fem år siden hadde tenkt over at om jeg ba en datamaskin om å huske tallet 3.1415926535897932384626433, så ville den sagt «Ok, sjef!», og umiddelbart glemt de ti siste sifrene.

En annen og litt mindre åpenbar konsekvens av dette er at addisjon ikke er en kommutativ operasjon på en datamaskin. Eller, sagt på norsk, det spiller en rolle hvilken rekkefølge du legger sammen tall i. Hvis du fyrer opp Python på maskinen din og skriver
1e8 + 5e-9 + 5e-9

så vil du (mest sannsynlig, det kan avhenge av plattform) se at resultatet ikke er det samme som om du skriver
5e-9 + 5e-9 + 1e8

Poenget er at i det første tilfellet begynner vi med et stort tall, og prøver to ganger å legge til noe som er så lite at det kreves 18 gjeldende siffer for å representere resultatet korrekt. I det siste tilfellet legger vi sammen de to små tallene først, og resultatet er stort nok til at det holder med 17 gjeldende siffer når vi legger til det store tallet, slik at svaret kan representeres riktig i datamaskinen.

Moralen er altså at det kan lønne seg å tenke på hva som egentlig foregår under panseret når man bruker datamaskinen som kalkulator.
Matteus, Are likes this
Category
Technology
Tags
programmering
flyttall
IEEE 754
Views
2783
Last edited by
Tor, 02.07.12 23:17