Professional Documents
Culture Documents
Arytmetyka zmiennopozycyjna
Wszystkie obliczenia w octavie s¡ wykonywane w arytmetyce zmiennopozy-
cyjnej (inaczej - arytmetyce ) podwójnej precyzji (double) - cho¢ w najnow-
szych wersjach octave'a istnieje mo»liwo±¢ u»ywania zmiennych typu single,
czyli zmiennych w pojedynczej precyzji arytmetyki zmiennopozycyjnej.
Dokªadno±¢ wzgl¦dna arytmetyki podwójnej precyzji wynosi ok. 10−16 , a
dokªadno±¢ arytmetyki pojedynczej precyzji wynosi ok. 10−7 .
W octavie jest kilka funkcji zwi¡zanych bezpo±rednio z wªasno±ciami aryt-
metyki , mianowicie:
36
i f ( ( eps +1)>1)
printf ( "%g+1>1 w f l \n" , eps ) ;
else
printf ( "%g n i e j e s t e p s i l o n e m maszynowym\n" , eps ) ;
endif
i f ((1+ eps /2)==1)
printf ( " f l (%g+1)=1\n" , eps / 2 ) ;
endif
37
o c t a v e :34 > x/2>0
ans = 0
o c t a v e :35 >
Sprawd¹my, jak dziaªaj¡ funkcje zwi¡zane ze zmian¡ precyzji arytmetyki
single i double - tu fragment sesji octave'a:
b=s i n g l e ( eps )
i f ( ( s i n g l e ( eps )+1)==1)
printf ( " f l ( s i n g l e ( e p s )+1)==1\n" ) ;
endif
i f ( ( d o u b l e ( b)+1) >1)
printf ( " f l ( d o u b l e ( s i n g l e ( e p s ))+1) >1.\ n" ) ;
endif
#a t e r a z e p s i l o n maszynowy p r e c y z j a p o j e d y n c z a
eps ( s i n g l e ( 1 ) )
Otrzymali±my, »e epsilon maszynowy w podwójnej precyzji wynosi: 2.2204e−
16, a w pojedynczej precyzji arytmetyki: 1.1921e − 07.
Teraz znajdziemy najmniejsz¡ liczb¦ dodatni¡ w arytmetyce pojedynczej
precyzji:
o c t a v e :52 > eps ( s i n g l e ( 0 ) )
ans = 1 . 4 0 1 3 e −45
o c t a v e :53 >
4.1.1 Przykªad
38
x=linspace (− a , a , 1 0 0 0 ) ;
plot ( x , f 1 ( x ) , " ; wzor 1 ; " , x , f 2 ( x ) , " ; wzor 2 ; " ) ;
Wykres na rysunku 4.1 pokazuje, »e wzór drugi jest lepszy ze wzgl¦du na
arytmetyk¦ .
Mo»emy oczywi±cie policzy¢ te» bª¡d pomi¦dzy wynikami:
e r=f 1 ( 1 e −7)− f 2 ( 1 e − 7)
Ró»nica 3.9964e−18 jest pozornie maªa, bo rz¦du 10−18 . Jednak f 2(10−7 )
jest rz¦du 10−14 , wi¦c dokªadno±¢ wzgl¦dna jest rz¦du 10−4 . Jest to bar-
dzo maªa dokªadno±¢, jak na arytmetyk¦ podwójnej precyzji, w której bª¡d
wzgl¦dny oblicze« jest na poziomie 10−16 .
Mo»emy policzy¢ wzgl¦dny bª¡d wzgl¦dem f 2(10−7 ):
abs ( ( f 1 ( 1 e −7)− f 2 ( 1 e − 7))/ f 2 ( 1 e − 7))
i otrzymamy 7.9928e − 04.
40
Rysunek 4.3: Wykres bª¦du w skali póªlogarytmicznej obliczania funkcji sinus
z rozwini¦cia w szereg
41
Rysunek 4.4: Wykres bª¦du przy obliczaniu pochodnej ilorazem ró»nicowym
dsin() dla x = 1 w zale»no±ci od h.
w arytmetyce :
f l(x + h) = f l(1 + h) = 1.
Sprawd¹my:
> h=eps /2
h = 1 . 1 1 0 2 e −16
> sin (1+h)− sin ( 1 )
ans = 0
#c z y na pewno
> sin (1+h)== sin ( 1 )
ans=1
Czyli rzeczywi±cie h nie mo»e by¢ dowolnie maªe.
Spróbujmy znale¹¢ dla tego przykªadu optymalne h postaci h = 2−n eks-
perymentalnie.
f=@sin ;
h=1; x =1;
42
Rysunek 4.5: Wykres bª¦du przy obliczaniu pochodnej ilorazem ró»nicowym
dsin() dla x = 1 w zale»no±ci od h w skali póªlogarytmicznej
f x=f ( x ) ; d f x=cos ( x ) ;
e r=zeros ( 5 3 , 1 ) ;
e r o p t=e r (1)= abs ( ( f ( x+h)− f x ) / h−d f x ) ;
hopt=h ; n=nopt =0;
while ( h>=eps )
h /=2;
n++;
e r ( n)= abs ( ( f ( x+h)− f x ) / h − d f x ) ;
i f ( e r ( n)< e r o p t )
e r o p t=e r ( n ) ;
nopt=n ;
hopt=h ;
endif
endwhile
printf ( " optymalne h=%g=2^(−%d ) \ n" , hopt , nopt ) ;
plot ( e r ) ;
43
Na wykresie nie wida¢ dokªadnie, por. rysunek 4.4, gdzie jest minimum.
Na wykresie w skali póª-logarytmicznej minimum jest widoczne, por. rysu-
nek 4.5:
semilogy ( e r )
Widzimy, »e optymalne h w tym przypadku jest rz¦du 2−27 , czyli ok 10−9 .
Mo»na powtórzy¢ te same obliczenia dla przybli»ania pochodnej za po-
moc¡ tzw. ilorazu centralnego:
f (x + h) − f (x − h)
f 0 (x) ≈ .
2h
44