Ett fl-exempel

På övningen pratade vi om fl. Några försökte hitta värden på a, b och c så att vi fick stort relativt fel i beräkningen av a + bc. Här följer ett exempel i fyrsiffrig decimal aritmetik:

a = 10.70, b = -4.567, c = 2.344. a + bc = -0.005048 exakt.  
fl(a + bc) = fl(a + fl(bc)), bc = -10.705048
fl(bc) = -10.71, och fl(a + (-10.71)) = -0.010.
 
Beloppet av absoluta felet är | -0.010 - (-0.005048) | = 0.004952. Notera att detta fel är ungefär lika stort som det exakta värdet.
 
Det relativa felet är 0.004952 / 0.005048 dvs. ungefär  0.98.
 
Relativa maskinnoggrannheten är 0.0005 som alltså har förstorats 0.98 / 0.0005, en faktor 2000. Vi har inte en siffra rätt i resultatet. Förstoringsfaktorn 2000 stämmer bra med vår uppskattning i kompendiet, eftersom vår gräns på det relativa felet ges av:

(1 + epsilon_mach) | bc | / | a + bc | + 1 som ungefär är 2123

Vad händer om vi byter tecken på b? Jo, vi får då ingen kancellation, och beräknar en mycket bra approximation av det exakta värdet.

a = 10.70, b = +4.567, c = 2.344. a + bc = 21.405048 exakt.  
fl(a + bc) = fl(a + fl(bc)), bc = 10.705048
fl(bc) = 10.71, och fl(a + 10.71) = 21.41, som är ett korrekt avrundat värde av det exakta resultatet.

Det relativa felet är  (21.41 - 21.405048) / 21.405048 ungefär 2.3e-4 = 0.46 epsilon_mach

Även detta result stämmer väl med vår uppskattning som ger värdet 0.5 (ungefär)


Back