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
så
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
så
fl(bc) = 10.71
, och fl(a + 10.71) = 21.41, s
om
ä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)