MN03LAB: Różnice pomiędzy wersjami
m MN Ćwiczenia 3 moved to MN03LAB |
Nie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
<!-- | <!-- | ||
Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php | Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php | ||
Linia 21: | Linia 20: | ||
</pre></div> | </pre></div> | ||
Oczywiście, | 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>, | 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> | 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 | 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 | 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>, | <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> | 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 | 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>. | 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, | 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 | 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).
Ćwiczenie: Szeregi zbieżne(?)
Podaj przykłady zbieżnych szeregów postaci , których -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 , albo
- numerycznie rozbieżne, to znaczy takie, że dla bardzo dużych zachodzi
suma == Inf
.
Wykonaj to samo zadanie, ale podając przykłady szeregów rozbieżnych (w arytmetyce dokładnej).
Ćwiczenie
Dla kolejnych wyznacz -tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy :
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 .
Czy --- zgodnie z teorią matematyczną --- sumy te dążą do wartości . Objaśnij dokładnie, co się stało.
Ćwiczenie
Już wcześniej stwierdziliśmy, że wyznaczanie dla dużego nie jest dobrym pomysłem. Przeprowadź eksperyment numeryczny potwierdzający to stwierdzenie i objaśnij jego wyniki.
Ćwiczenie
Jak wiadomo, szereg harmoniczny 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);
Ć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 należy wyznaczyć przybliżenie , stosując metodę Herona. Zaproponuj
dobre przybliżenie początkowe wiedząc, że jest liczbą maszynową typu
double
. Ile iteracji wystarczy, by osiągnąć -zadowalające przybliżenie?
Ćwiczenie: Zadanie o wyznaczaniu odwrotności bez dzielenia metodą Newtona
Należy wyznaczyć przybliżenie stosując metodę Newtona do równania
. Zaproponuj
dobre przybliżenie początkowe wiedząc, że jest liczbą maszynową typu
double
. Ile iteracji wystarczy, by osiągnąć -zadowalające przybliżenie?
Ćwiczenie
Niech . Czy z punktu widzenia błędów w lepiej jest policzyć sumę tych liczb w kolejności od najmniejszej do największej, czy odwrotnie?