Datoraritmetik Beräkningsvetenskap I Från labben Två huvudtyper av fel: diskretiseringsfel och avrundningsfel Olika sätt att mäta fel: relativt fel, absolut fel Begreppen ε M, Inf, NaN, overflow, underflow, diskretisering Beräkningen A -1 A blev inte riktigt enhetsmatrisen Från labben Numerisk beräkning av derivata med Några exempel Uttryck exakt i Matlab Se lab Hur mäter man fel? Det exakta talet betecknas x Samma tal men som innehåller fel betecknas Felen kan t ex vara avrundningsfel eller mätfel Felet kan mätas Om x är en vektor blir det istället kallas för norm. Mer om detta senare. Hur mäter man fel? Exempel från labben: Du köper varmkorv en lördagkväll. Den kostar 15 kr, men av misstag betalar du 20 kr. Du köper en ny bil för 299995 kr, men betalar 300000 kr och bryr dig inte om växeln. Man förlorar lika mycket, men det känns sannolikt mindre i det andra fallet. Relativt fel upplevs ofta som mer korrekt än absolut fel 1
Representation av tal i dator Alla tal lagras i ett begränsat antal bitar i minnet, vanligen i binär form. Exempel: 0 1 0 1 1 1 0 0 betyder (01011100) 2 = 0 2 7 + 1 2 6 + 0 2 5 + + 1 2 4 + 1 2 3 + 1 2 2 + 0 2 1 + 0 2 0 = (92) 10 Lagring i dator Heltal Inga problem. Heltal upp till en viss storlek (beroende på antalet bitar) lagras exakt. Reella tal Kan inte lagras exakt utan måste avrundas. Representationen av reella tal kallas flyttalsrepresentation och talen kallas flyttal. Exempel (bas β = 10) Reella talet x=0.06666 kan skrivas x = 0.06666 = 6.6666 10-2 = = (6 10 0 + 6 10-1 + 6 10-2 + 6 10-3 + ) 10-2 d 0 d 1 d 2 d 3 β kallas mantissa m bas β Observation: 0 d i < 10 och 1 m < 10 Flyttal flytande decimalpunkt Slutsats Reellt tal x kan skrivas (i exakt representation) x = m β e där β är den bas som används, e är exponenten och m är mantissan. För mantissan gäller att m = ±(d 0.d 1 d 2 ) = = ±(d 0 β 0 + d 1 β -1 + d 2 β -2 + ), 0 d i < β Om man flyttar decimalpunkten så att första termen d 0 0 kallas detta normaliserad form. Då blir 1 m < β Hur ska reella talet kunna representeras i datorns begränsade antal bitar? Exponenten kan lagras exakt upp till en viss storlek Mantissa måste kapas på något sätt eftersom oändligt antal siffror görs genom avrundning När det reella talet x lagras i datorn görs det som flyttal, betecknas fl(x) Exemplet igen Antag plats för 4 tal i datorns mantissa x=0.06666 ger fl(x) = 6.667 10-2 = = (6 10 0 + 6 10-1 + 6 10-2 + 7 10-3 ) 10-2 Slutsats Ett flyttal fl(x) kan skrivas (i normaliserad form) där talet 0 representeras på särskilt sätt Ett flyttalssystem karaktäriseras av (β,p,l,u) fl(x) = ˆm β e, ˆm = ±(d 0.d 1 d 2,,d p 1 ) 1 d i < β, d 0 0, l e u p kallas precision, mantissan rundas av Exponenten e är heltal och lagras exakt inom undre och övre gräns, l och u. Lagras: och e. β är fixt och lagras ej. Vanligen β = 2 (β,p,l,u) = (2,3,0,2) Mantissan kan anta följande positiva värden (motsvarande för negativa tal): För olika värden på exponenten e fås då min max 2
+ + + + + + + + + e=0 underflow e=1 e=2 overflow Flyttalen ej jämnt representerade större tal ger glesare representation När ett reellt tal ska lagras i datorns minne, avrundas det och hamnar på närmaste linje på tallinjen. Ex) talet 5.45 blir fl(5.45) = 5 + + * + + + + * + + * + Några tester 2.2 + 4.4: fl( fl(2.2)+fl(4.4) ) = fl(2.0+4.0) = fl(6.0) = 6.0 Exakt: 6.6 6.6-6.0 = 0.6 6.6-6.0 / 6.6 = 0.0909 = 9.09% (2.2 + 4.4) - 1.2: fl(fl( fl(2.2)+fl(4.4) ) - fl(1.2)) = fl(6.0-1.25) = fl(4.75) = 5.0 Exakt: 5.4 5.4-5.0 = 0.4 5.5-5.0 / 5.4 = 0.0741 = 7.41% 2.2 + (4.4-1.2): fl( fl(2.2)+fl(fl(4.4) - fl(1.2))) = fl( 2.0+fl(4.0-1.25))= fl(2.0+fl(2.75))=fl(2.0+3.0)= = fl(5.0) = 5.0 Exakt: 5.5 5.5-5.0 = 0.5 5.5-5.0 / 5.5 = 0.0909 = 9.09% Samma beräkning, men i annan ordning gav olika svar 3.3+(4.5-1.2): fl( fl(3.3) + fl(fl(4.5) - fl(1.2))) = fl( 3.5 + fl(5.0-1.25)) = fl(3.5 + fl(3.75))=fl(3.5 + 4.0) = Inf pga overflow Exakt: 6.6 Om man hamnar under min kan man släppa på normaliseringskravet Mantissan kan anta följande positiva värden 0 1 2 + + + subnormala tal Ger en liten extraskala under min-gränsen, kallas subnormalt tal I Matlab: realmin anger minsta normaliserade tal, går att hitta mindre subnormala tal 3
Hur stort kan felet bli? Vi tittar först enbart på mantissan: Maximalt fel i mantissan då talet x ligger exakt mitt emellan två tal i. Mantissan består i exemplet av 1, 1.25, 1.5, 1.75. Maximalt fel blir då 0.125, dvs m - 0.125 Allmänna fallet gäller Stämmer det för vårt flyttalssystem? Hur stort kan felet bli? Felet i hela talet fl(x) : Absoluta felet fl(x) x = ˆmβ e mβ e = ( ˆm m)β e 1 2 β ( p 1) β e Felet beror av storleken på x glesare representation högre upp på flyttalslinjen. Relativa felet fl(x) x = ˆmβ e mβ e 1 β ( p 1) e β x m β e 2 m β e Test: Stämmer! Beror inte på talets storlek! Hur stort kan felet bli? Felet i hela talet fl(x): Alltså, vid avrundning gäller fl(x) x ε, där ε x M M = 1 2 β1 p Talet ε M kallas maskinepsilon och är en maskinberoende konstant Maskinepsilon kan även definieras som det minsta tal ε så att fl(1+ ε ) >1 I Matlab ger kommandot eps maskinepsilon, se lab Var finns maskinepsilon i flyttalssystemet? underflow underflow ε M - maximala relativa felet mellan ett tal x och närmaste punkt på tallinjen (dvs storleken på relativt storleken på talet x) Ju tätare tallinje ju mindre ε M ε har inget med underflow eller overflow, dvs M hur stora/små tal som kan representeras, att göra Avrundningsfel i beräkningsprocesser? Maskinepsilon anger maximalt fel vid lagring av ett tal Beräkningsprocesser, t ex Gausselimination eller A -1 A innehåller mängder av beräkningar och lagringar, inklusive beräkning med tal som tidigare avrundats den sammanlagd effekten av felen brukar vara lite sämre än ε M Vanligen avrundningsfelen små i förhållande till alla andra fel (diskretiseringsfel, mätnoggrannhet etc) Kancellation Problem vid subtraktion av nästan lika tal: Ex) Antag två tal med blandat avrundningsskräp långt ute i decimalerna. får beteckna avrundningsskräp fl(1.21 5423 58-1.21 5336 79) = = fl(0.00 0001 ) = 1. 10 -k Avrundningsfel har nästan helt tagit över. Detta kallas kancellation. 4
Kancellation Exempel) Från lab: Stora fel när h blir litet Stora fel när q blir litet Kan (i vissa fall) lösas genom att använda andra formler eller omskrivning fungerar bättre (uttrycket ovan förlängt med konjugatet) Några konsekvenser Ej meningsfullt med tester av typen if (x==y) end om x och y är flyttal. Istället if abs(x-y)< tol eller if abs(x-y)< tol*abs(x) Undvik subtrahera nästan lika stora tal Summera om möjligt termer i växande ordning (t ex när man summerar serier). Under 60- och 70-talen hade varje datortillverkare sitt eget flyttalssystem En flyttalsstandard utvecklades under tidigt 80-tal och följdes av tillverkare som Intel och Motorola Utvecklat av arbetsgrupp hos Institute for Electrical and Electronics Enngineerings (IEEE) IEEE-standarden har tre viktiga krav: Konsistent flyttalsrepresentation Korrekt avrundningsaritmetik Konsistent hantering av exceptionella situationer Tre standartyper av flyttal: Single precision (enkel precision) Double precision (dubbel prec) Extended precision (utökad prec) IEEE enkel precision ± e 1 e 2 e 8 d 0 d 1 d 2 d 22 tecknet 1 bit, exponent 8 bitar, mantissa 23 bitar => totalt 32 bitar IEEE dubbel precision ± e 1 e 2 e 11 d 0 d 1 d 2 d 51 tecknet 1 bit, exponent 11 bitar, mantissa 52 bitar => totalt 64 bitar Hidden bit Behöver d 0 lagras? Nej, Gäller alltid att d 0 =1. Man vinner då en bit, en s k hidden bit. Får istället IEEE enkel precision IEEE dubbel precision ± e 1 e 2 e 11 d 1 d 2 d 52 ± e 1 e 2 e 8 d 1 d 2 d 23 (β,p,l,u) i IEEE-standard IEEE single (2,24,-126,128) IEEE double (2,53,-1022,1024) Obs utnyttjat hidden bit! Maskinepsilon blir IEEE single ε M = 2-23 1.2 10-7 IEEE double ε M = 2-52 1.1 10-16 IEEE extended ε M = 2-63 1.1 10-19 5
Diskretiseringsfel IEEE definierar fem olika exceptions Invalid operation, t ex (Not a Number), 0 => ges värdet NaN Division med 0 => sätt till ± (dvs Inf i Matlab) overflow => sätt till ± eller största flyttal underflow => sätt till 0 (eller subnormalt tal) Korrekt avrundning av reella tal (inte exceptionell situation egentligen) För den som vill veta mer http://en.wikipedia.org/wiki/ieee_floating-point_standard http://www.validlab.com/goldberg/paper.pdf Förutom avrundningsfel finns även diskretiseringsfel Exempel) Numerisk derivering från lab När h blir mindre borde approximationen bli bättre mindre diskretiseringsfel Här dominerar avrundningsfel Här dominerar diskretiseringsfel Diskretiseringsfel Numerisk derivering Tolkning: Det finns flera formler för derivering: För stora h dominerar diskretiseringsfelet, man kan bortse från avrundningsfelet För små h dominerar avrundningsfelet Avrundningsfelet blir stort i det här fallet pga kancellation i täljaren för små h division med litet tal förstärker felet i täljaren Avrundningsfelet uppför sig kaotiskt, medan diskretiseringsfelet ger en jämn och snygg kurva y y f (x+h) f (x) h f (x+h) f (x h) 2h Framåtdifferens (se lab) Centraldifferens f (x+2h)+8 f (x+h) 8 f (x h)+ f (x 2h) y 12h Fempunktsformel Numerisk derivering Samma test som i labben: Diskretiseringsfel och avrundningsfel Sammanfattning Vilken metod ska man välja? Varför? Diskretiseringsfelet spelar vanligen den dominerande rollen. Vanligt att man helt kan bortse från avrundningsfelen. Avrundningsfelet får konsekvenser i vissa fall, t ex vid kancellation. Exakt noll existerar inte i praktiken för flyttal. Diverse avrundningar gör att tal som kan anses vara lika ändå skiljer sig ute i decimalerna Ett relativt fel i sorleksordningen ε M efter beräkning med flyttal är enbart slumpmässigt skräp 6