MN03LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
Dorota (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
<!--  
<!--  
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php
Linia 21: Linia 20:
</pre></div>
</pre></div>
   
   
Oczywiście, "teoretycznie" wszystkie trzy liczby powinny być sobie
Oczywiście, teoretycznie wszystkie trzy liczby powinny być sobie
równe (i niezerowe).  
równe (i niezerowe).  


Linia 35: Linia 34:
<div class="exercise">
<div class="exercise">


Podaj przykłady <strong>zbieżnych</strong> szeregów postaci <math>\displaystyle \sum_{n=1}^{\infty} a_n</math>, którego <math>\displaystyle N</math>-te sumy częściowe
Podaj przykłady <strong>zbieżnych</strong> szeregów postaci <math>\displaystyle \sum_{n=1}^{\infty} a_n</math>, których <math>\displaystyle N</math>-te sumy częściowe
obliczone w arytmetyce pojedynczej precyzji algorytmem
obliczone w arytmetyce pojedynczej precyzji algorytmem
<div class="code" style="background-color:#e8e8e8; padding:1em"><pre>
<div class="code" style="background-color:#e8e8e8; padding:1em"><pre>
Linia 70: Linia 69:
<div class="exercise">
<div class="exercise">


Dla kolejnych <math>\displaystyle N</math>, wyznacz <math>\displaystyle N</math>-tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy <math>\displaystyle x=-90</math>:
Dla kolejnych <math>\displaystyle N</math> wyznacz <math>\displaystyle N</math>-tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy <math>\displaystyle x=-90</math>:
<center><math>\displaystyle  
<center><math>\displaystyle  
e^x \approx \sum_{n=0}^N \frac{x^n}{n!},
e^x \approx \sum_{n=0}^N \frac{x^n}{n!},
</math></center>
</math></center>


korzystając z algorytmu podanego w poprzednim zadaniu. Porównaj błąd: względny
korzystając z algorytmu podanego w poprzednim zadaniu. Porównaj błąd względny
i bezwzględny w porównaniu
i bezwzględny w porównaniu
do wartości wyznaczonej z wykorzystaniem funkcji bibliotecznej <code>exp()</code>. Powtórz następnie dla <math>\displaystyle x=10</math>.
do wartości wyznaczonej z wykorzystaniem funkcji bibliotecznej <code>exp()</code>. Powtórz następnie dla <math>\displaystyle x=10</math>.
Linia 142: Linia 141:
Nasza suma przekroczy wartość 20, więc aby <code>20 + dskladnik == 20</code>, musi
Nasza suma przekroczy wartość 20, więc aby <code>20 + dskladnik == 20</code>, musi
być dskładnik <math>\displaystyle \approx 10^{-15}</math> (lub więcej). Tymczasem zakres liczb typu integer wynosi
być dskładnik <math>\displaystyle \approx 10^{-15}</math> (lub więcej). Tymczasem zakres liczb typu integer wynosi
niewiele ponad <math>\displaystyle 10^9</math>, więc po jakimś czasie dlicznik przyjmie wartości ujemne.
niewiele ponad <math>\displaystyle 10^9</math>, więc po jakimś czasie licznik przyjmie wartości ujemne.


Aby doliczyć się "do końca", musielibyśmy licznik potraktować jako liczbę typu
Aby doliczyć się "do końca", musielibyśmy licznik potraktować jako liczbę typu
<code>long long double</code>, którego zakres sięga <math>\displaystyle 10^{18}</math>. Ale i tak mielibyśmy
<code>long long double</code>, której zakres sięga <math>\displaystyle 10^{18}</math>. Ale i tak mielibyśmy
kłopot z doczekaniem do końca działalności programu.
kłopot z doczekaniem do końca działalności programu.


Linia 166: Linia 165:
<div class="exercise">
<div class="exercise">


Dla zadanej liczby <math>\displaystyle a>1</math>, należy wyznaczyć przybliżenie <math>\displaystyle \sqrt{a}</math> stosując metodę Herona. Zaproponuj
Dla zadanej liczby <math>\displaystyle a>1</math> należy wyznaczyć przybliżenie <math>\displaystyle \sqrt{a}</math>, stosując metodę Herona. Zaproponuj
dobre przybliżenie początkowe <math>\displaystyle x_0</math> wiedząc, że <math>\displaystyle a</math> jest liczbą maszynową typu
dobre przybliżenie początkowe <math>\displaystyle x_0</math> wiedząc, że <math>\displaystyle a</math> jest liczbą maszynową typu
<code>double</code>. Ile iteracji wystarczy, by osiągnąć <math>\displaystyle \epsilon</math>-zadowalające przybliżenie?
<code>double</code>. Ile iteracji wystarczy, by osiągnąć <math>\displaystyle \epsilon</math>-zadowalające przybliżenie?
Linia 181: Linia 180:


dla pewnego (znanego) <math>\displaystyle k \in N</math>, przy czym <math>\displaystyle \frac{1}{2} \leq \sqrt{g} \leq 1</math>.  
dla pewnego (znanego) <math>\displaystyle k \in N</math>, przy czym <math>\displaystyle \frac{1}{2} \leq \sqrt{g} \leq 1</math>.  
Wobec tego, obliczenie
Wobec tego obliczenie
<math>\displaystyle \sqrt{a}</math> wymaga po prostu obliczenia <math>\displaystyle \sqrt{g}</math>. Najprostsze przybliżenie <math>\displaystyle \sqrt{g}</math> to
<math>\displaystyle \sqrt{a}</math> wymaga po prostu obliczenia <math>\displaystyle \sqrt{g}</math>. Najprostsze przybliżenie <math>\displaystyle \sqrt{g}</math> to
<math>\displaystyle \sqrt{g}\approx 1</math>. Błąd takiego przybliżenia to
<math>\displaystyle \sqrt{g}\approx 1</math>. Błąd takiego przybliżenia to
Linia 207: Linia 206:
</math></center>
</math></center>


to możemy jako pierwsze przybliżenie wybrać <math>\displaystyle x_0 = \frac{3}{4}2^{-p}</math>. (Jak
to możemy jako pierwsze przybliżenie wybrać <math>\displaystyle x_0 = \frac{3}{4}2^{-p}</math>. Jak
wybrać lepsze <math>\displaystyle x_0</math>?)
wybrać lepsze <math>\displaystyle x_0</math>?


Wtedy mamy następujące oszacowania:
Wtedy mamy następujące oszacowania:
Linia 224: Linia 223:
\frac{1}{a}|}{\frac{1}{a}} = |x_{k+1}a - 1| \leq \epsilon = 2^{-53}</math>, to
\frac{1}{a}|}{\frac{1}{a}} = |x_{k+1}a - 1| \leq \epsilon = 2^{-53}</math>, to
musimy wykonać co najwyżej <math>\displaystyle 6</math> iteracji. Ponieważ koszt jednej iteracji
musimy wykonać co najwyżej <math>\displaystyle 6</math> iteracji. Ponieważ koszt jednej iteracji
to 3 flopy, zatem wyznaczenie odwrotności <math>\displaystyle a</math> byłoby 18 razy droższe od
to 3 flopy, wyznaczenie odwrotności <math>\displaystyle a</math> byłoby 18 razy droższe od
mnożenia i dodawania, które mają podobny koszt.
mnożenia i dodawania, które mają podobny koszt.


Tymczasem, we współczesnych realizacjach, dzielenie jest tylko około 4 razy droższe od
Tymczasem we współczesnych realizacjach dzielenie jest tylko około 4 razy droższe od
mnożenia! Możesz sprawdzić,  
mnożenia! Możesz sprawdzić,  
[http://www.cs.utexas.edu/users/moore/publications/divide_paper.pdf  jak to się dzieje np. w procesorach AMD].
[http://www.cs.utexas.edu/users/moore/publications/divide_paper.pdf  jak to się dzieje np. w procesorach AMD].
Linia 243: Linia 242:
Niech <math>\displaystyle 0 < a_1 < a_2 < \cdots < a_n</math>. Czy z punktu widzenia  
Niech <math>\displaystyle 0 < a_1 < a_2 < \cdots < a_n</math>. Czy z punktu widzenia  
błędów w <math>\displaystyle fl_\nu</math> lepiej jest policzyć sumę tych liczb w kolejności  
błędów w <math>\displaystyle fl_\nu</math> lepiej jest policzyć sumę tych liczb w kolejności  
od najmniejszej do największej czy odwrotnie?  
od najmniejszej do największej, czy odwrotnie?  
</div></div>
</div></div>



Wersja z 17:42, 21 wrz 2006


Ćwiczenia. Własności arytmetyki zmiennopozycyjnej.

Ćwiczenie: Równe i równiejsze

Wyjaśnij, dlaczego w arytmetyce podwójnej precyzji IEEE 754 mamy

 
octave:19> 2006/1e309
ans = 0
octave:20> 2.006/1e306
ans =  2.0060e-306
octave:21> (2006/1000)/(1e309/1000)
ans = 0

Oczywiście, teoretycznie wszystkie trzy liczby powinny być sobie równe (i niezerowe).

Wskazówka

Ćwiczenie: Szeregi zbieżne(?)

Podaj przykłady zbieżnych szeregów postaci n=1an, których N-te sumy częściowe obliczone w arytmetyce pojedynczej precyzji algorytmem

 
suma = 0.0;
for n = 1..N
	suma += <math>\displaystyle a_n</math>;

będą

  • ograniczone niezależnie od N, albo
  • numerycznie rozbieżne, to znaczy takie, że dla bardzo dużych N zachodzi

suma == Inf.

Wykonaj to samo zadanie, ale podając przykłady szeregów rozbieżnych (w arytmetyce dokładnej).

Rozwiązanie

Ćwiczenie

Dla kolejnych N wyznacz N-tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy x=90:

exn=0Nxnn!,

korzystając z algorytmu podanego w poprzednim zadaniu. Porównaj błąd względny i bezwzględny w porównaniu do wartości wyznaczonej z wykorzystaniem funkcji bibliotecznej exp(). Powtórz następnie dla x=10.

Czy --- zgodnie z teorią matematyczną --- sumy te dążą do wartości ex. Objaśnij dokładnie, co się stało.

Rozwiązanie

Ćwiczenie

Już wcześniej stwierdziliśmy, że wyznaczanie e(1+1/n)n dla dużego n nie jest dobrym pomysłem. Przeprowadź eksperyment numeryczny potwierdzający to stwierdzenie i objaśnij jego wyniki.

Ćwiczenie

Jak wiadomo, szereg harmoniczny n=11/n jest rozbieżny. Spróbuj przewidzieć, jaki będzie efekt numerycznego wyznaczenia tej sumy w arytmetyce podwójnej precyzji przy użyciu poniższego kodu.

 
	int dlicznik;
	double dsuma, dstarasuma;
	double dskladnik;
	
	dstarasuma = 0.0; dsuma = 1.0; dlicznik = 1;
	while(dstarasuma != dsuma) 
	{
		dskladnik = 1.0/dlicznik;
		dstarasuma = dsuma;
		dsuma += dskladnik;
		dlicznik++;
	}
	printf("Suma = %e. Liczba składników = %d, składnik = %e\n", 
		dsuma, dlicznik-1, dskladnik);
	 
Wskazówka
Rozwiązanie

Ćwiczenie

Jak szybko i na jakiej wysokości musiałby lecieć samolot npla, aby pocisk wystrzeliwany z działka z prędkością 7500 km/h nie trafił w cel, gdy potrzebne pierwiastki liczone są wzorem szkolnym?

Ćwiczenie: Zadanie o wyznaczaniu pierwiastka kwadratowego metodą Newtona

Dla zadanej liczby a>1 należy wyznaczyć przybliżenie a, stosując metodę Herona. Zaproponuj dobre przybliżenie początkowe x0 wiedząc, że a jest liczbą maszynową typu double. Ile iteracji wystarczy, by osiągnąć ϵ-zadowalające przybliżenie?

Rozwiązanie

Ćwiczenie: Zadanie o wyznaczaniu odwrotności bez dzielenia metodą Newtona

Należy wyznaczyć przybliżenie 1a stosując metodę Newtona do równania 1xa=0. Zaproponuj dobre przybliżenie początkowe x0 wiedząc, że a jest liczbą maszynową typu double. Ile iteracji wystarczy, by osiągnąć ϵ-zadowalające przybliżenie?

Rozwiązanie

Ćwiczenie

Niech 0<a1<a2<<an. Czy z punktu widzenia błędów w flν lepiej jest policzyć sumę tych liczb w kolejności od najmniejszej do największej, czy odwrotnie?

Rozwiązanie