diff --git a/sose2020/num/uebungen/nulladdition.cpp b/sose2020/num/uebungen/nulladdition.cpp new file mode 100644 index 0000000..b2b70bd --- /dev/null +++ b/sose2020/num/uebungen/nulladdition.cpp @@ -0,0 +1,20 @@ +#include +#include + +using namespace std; + +int main() { + cout << setprecision(17); + cout << setw(10); + cout << "Enter a float > "; + float x; + cin >> x; + x = x + 1; + cout << x << endl; + + cout << "Enter a double > "; + double y; + cin >> y; + y = y + 1; + cout << y << endl; +} diff --git a/sose2020/num/uebungen/num1.pdf b/sose2020/num/uebungen/num1.pdf new file mode 100644 index 0000000..18f4762 Binary files /dev/null and b/sose2020/num/uebungen/num1.pdf differ diff --git a/sose2020/num/uebungen/num1.tex b/sose2020/num/uebungen/num1.tex new file mode 100644 index 0000000..577cdc6 --- /dev/null +++ b/sose2020/num/uebungen/num1.tex @@ -0,0 +1,124 @@ +\documentclass[uebung]{../../../lecture} + +\begin{document} + +\title{Einführung in die Numerik: Übungsblatt 1} +\author{Leon Burgard, Christian Merten} + +\punkte + +\begin{aufgabe} + \begin{enumerate}[a)] + \item Zur Basis 10 dargestellt: + \[ + (0.5731 \times 8^{5})_{8} = (5\cdot 8^{-1} + 7 \cdot 8^{-2} + 3 \cdot 8^{-3} + 1 \cdot 8^{-4}) + \cdot 8^{5} = 24264 = 0.24264 \times 10^{5} + .\] + \item Die Zahl $x_1 = (0.3)_{10} \in \R$ + in der normierten Fließkommadarstellung + $\mathbb{F}(2,11,2)$ ergibt + \[ + (0.10011001100 \times 2^{1})_{2} + .\] + Zurück in $\mathbb{F}(10,r,1)$ ergibt + \[ + (0.2998046875 \times 10^{0})_{10} + .\] Das heißt für $r = 1$, $r = 2$ und $r = 3$ ergibt natürliche Rundung + jeweils $(0.3)_{10}$. Größere $r$ ergeben andere Ergebnisse. + \item Die größte positive Zahl in $\mathbb{F}(4, 6, 2)$ ergibt sich im Dezimalsystem dargestellt + als: + \[ + 3 \cdot (4^{-1} + 4^{-2} + 4^{-3} + 4^{-4} + 4^{-5} + 4^{-6}) \cdot 4^{3\cdot 4^{0} + 3\cdot4^{1}} + = 0.1073 \cdot 10^{10} + .\] Die kleinste negative Zahl in $\mathbb{F}(3, 7, 1)$ ergibt sich im Dezimalsystem dargestellt + als: + \[ + - 2 \cdot (3^{-1} + 3^{-2} + \ldots + 3^{-7}) \cdot 3^{2 \cdot 3^{0}} \approx -0.8996 \cdot 10^{1} + .\] Damit folgt für den maximalen Abstand zweier Zahlen aus $\mathbb{F}(4,6,2)$ und + $\mathbb{F}(3,7,1)$: + \[ + \max_{x_2, x_3} | x_2 - x_3 | \approx + 0.1073 \cdot 10^{10} + 0.8996 \cdot 10^{1} \approx 0.1073 \cdot 10^{10} + .\] + \item Die Aussage ist falsch. Gegenbeispiel: $\mathbb{F}(2, 2, 1)$. Die Menge der darstellbaren + Zahlen ist hier, analog zur Vorlesung: + \[ + \mathbb{F}(2,2,1) = \left\{- \frac{3}{2}, -1, -\frac{3}{4}, -\frac{1}{2}, -\frac{3}{8}, + -\frac{1}{4}, 0, \frac{1}{4}, \frac{3}{8}, \frac{1}{2}, \frac{3}{4}, 1, \frac{3}{2}\right\} + .\] Hier ist sofort zu sehen, dass beispielsweise für $x_4 = 1$ gilt: + \[ + \left| 1 - \frac{3}{4}\right| = \frac{1}{4} \neq \frac{1}{2} = \left| \frac{3}{2} - 1 \right| + .\] + \end{enumerate} +\end{aufgabe} + +\begin{aufgabe} + Die ersten zehn Folgenglieder in Dezimaldarstellung (nicht normiert): + \begin{table}[h!] + \centering + \label{tab:label} + \begin{tabular}{ccc} + $n$ & Aufrunden & gerades Runden \\ + $0$ & $2.46$ & $2.46$ \\ + $1$ & $2.47$ & $2.46$ \\ + $2$ & $2.48$ & $2.46$ \\ + $3$ & $2.49$ & $2.46$ \\ + $4$ & $2.50$ & $2.46$ \\ + $5$ & $2.51$ & $2.46$ \\ + $6$ & $2.52$ & $2.46$ \\ + $7$ & $2.53$ & $2.46$ \\ + $8$ & $2.54$ & $2.46$ \\ + $9$ & $2.55$ & $2.46$ \\ + $10$ & $2.56$ & $2.46$ \\ + \end{tabular} + \end{table} + + Beim Aufrunden ist deutlich zu sehen, dass, da nach jedem Rechenschritt die 4. Stelle + auf $5$ steht, jedes mal aufgerundet wird. Da zwei Rundungen pro Folgenglied stattfinden, + führt das zu einer Erhöhung um $2 \cdot 0.005 = 0.01$ pro Folgenglied. + + Beim geraden Runden wird zwar nach der ersten Operation aufgerundet, nach der zweiten jedoch nicht. + Deshalb bleibt das Ergebnis exakt. +\end{aufgabe} + +\begin{aufgabe} + Programm zum Test der Nulladdition: + \begin{lstlisting}[language=C++, title=nulladdition.cpp, captionpos=b] +#include +#include + +using namespace std; + +int main() { + // set output width and precision + cout << setprecision(17); + cout << setw(10); + + // float + cout << "Enter a float > "; + float x; + cin >> x; + x = x + 1; + cout << x << endl; + + // double + cout << "Enter a double > "; + double y; + cin >> y; + y = y + 1; + cout << y << endl; +}\end{lstlisting} + \begin{enumerate}[a)] + \item Bei Verwendung von \lstinline{float} muss $x$ als $5\cdot 10^{-8}$ gewählt werden, bei + Verwendung von \lstinline{double} muss $x$ als $10^{-16}$ gewählt werden, damit + exakt $1$ zurückgegeben wird. + \item Das ist bei weitem nicht die kleinste positive Zahl, die \lstinline{float} bzw. + \lstinline{double} darstellen können, da im Exponenten noch weit mehr Stellen zur Verfügung + stehen, um sehr viel kleinere positive Zahlen darstellen zu können. + + Allerdings kann dies hier nicht genutzt werden, da durch die Addition mit $1$ gerundet werden + muss. + \end{enumerate} +\end{aufgabe} + +\end{document}