JavaScript is currently disabled.Please enable it for a better experience of Jumi. Intels cpu:er får bakläxa i trigonometri
π

Intels cpu:er får bakläxa i trigonometri

Den matematiska funktionen sinus har urusel precision på Intelprocessorer när den används på värden  nära π (3,14159…). Det har en Googleprogrammerare upptäckt. Intel lovar att korrigera – sin dokumentation.
Sinus för 3,1415926535897932385 är ungefär −5,0 × 10−20. Men Intels x86- och x64-processorer hävdar att det är −5,4 × 10−20.

Upptäckten gjordes av Googleprogrammeraren Bruce Dawson.

Svaret är fel från och med andra decimalen trots att noggrannheten för den här typen av värden egentligen ska vara cirka 18 decimaler. Felet är en triljon gånger större än det ska vara, påpekar Bruce Dawson.

Talet ovan ligger så nära man kan komma den matematiska konstanten π i datorn, och här är felet i sinusfunktionen som störst(*). Det krymper ju längre från π man kommer och vid ungefär sinus(3,01) klarar Intels processor åter att ge full noggrannhet i svaret.

Problemet beror enligt Bruce Dawson på så kallad utsläckning. Fenomenet uppstår när man subtraherar två tal med nästan samma värde. Där siffrorna i talen är lika får man nollor i differens och därmed finns endast ett fåtal värdesiffror kvar när man klar med subtraktionen. De ursprungliga värdesiffrorna har släckt ut varandra.

I beräkningen av sinus finns ett steg när just π subtraheras vilket är vad som senare fördärvar noggrannheten runt π.

Det här är inte första gången som Intel får underkänt för sina trigonometriska implementationer. Och det är inte första gången som det här felet ger sig till känna. Bruce Dawson pekar exempelvis på en 15 år gammal buggrapport för sinus i programspråket Java under operativsystemet Windows – det hade denna bugg som orsak.

Intel ska ändra sin dokumentation efter Bruce Dawsons påpekande. Att korrigera felet i sig skulle innebära att Intel riskerade att programvara som redan förlitar sig på felet, skulle sluta att fungera.

Man kan tycka att ett fel som i absoluta tal är så litet, inte är något att bry sig om. Men om man dividerar två tal med den här onoggranheten kan man få ett stort fel.

Problem med utsläckning är ständigt närvarande när man gör numeriska beräkningar på datorer, och något man måste använda olika knep för att komma runt. Men man är inte beredd på att processorn i sig ska introducera problematiken, särskilt inte när dokumentationen lovar något annat.

Också när man beräknar sinus för mycket stora tal ger Intels processorer fel svar. Dessutom är felen mycket större än ovan. Men det är ett mindre problem eftersom ingen har särskilt stor nytta av sinus för mycket stora tal(**).

Bruce Dawson stötte på felet när han lekte med en regel som säger att x + sin(x) är en ungefär dubbelt så bra approximation till π som x är. Exempelvis är 3,1 + sin(3,1) lika med 3,14158, där som synes bara den sista siffran är fel.

FOTNOT:
(*) Matematiskt är sinus noll för det exakta värdet π. Men en dator kan inte representera π exakt i siffror. Så inte ens sinus för Intels inbyggda konstant pi ska vara exakt noll. Man kan tänka på det som att den inbyggda pi-konstanten som representeras av 66 binära siffror underförstått fortsätter med en oändlig följd nollor där π har andra siffror.

(**) Funktionen sinus anger y-koordinaten för en punkt  på en cirkel med radien ett. Cirkelns omkrets är blott 2π. Att beräkna sinus för stora tal motsvarar att snurra en massa varv på cirkeln innan man sätter ner linjalen för att beräkna den där y-koordinaten. Det är så glest mellan flyttal – datorns approximation av reella tal – att avrundningsfelet mellan dem motsvarar många, många cirkelvarv när talen är stora. Så beroende på hur du avrundar, kan sinus för ditt mätvärde hamna nästan var som helst på cirkeln.
MER LÄSNING:
 
KOMMENTARER
Kommentarer via Disqus

Anne-Charlotte Lantz

Anne-Charlotte
Lantz

+46(0)734-171099 ac@etn.se
(sälj och marknads­föring)
Per Henricsson

Per
Henricsson
+46(0)734-171303 per@etn.se
(redaktion)

Jan Tångring

Jan
Tångring
+46(0)734-171309 jan@etn.se
(redaktion)