add num1
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
#include<iostream>
|
||||
#include<iomanip>
|
||||
|
||||
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;
|
||||
}
|
||||
Binary file not shown.
@@ -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<iostream>
|
||||
#include<iomanip>
|
||||
|
||||
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}
|
||||
Reference in New Issue
Block a user