\documentclass[11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage{german}
\usepackage{a4wide}

\pagestyle{empty}

\begin{document}
\centerline{\it Vorlesung: Physik auf dem Computer I}
\bigskip
\centerline{\bf ÜBUNG 4} 
\medskip
\centerline{\it Operatoren, Fallstricke in C, numerische Genauigkeit}

\bigskip


{\bf Aufgabe 1.\ } {\it Quiz: Elementare Rechenoperationen, Felder und
  Pointer}\\
Notieren sie sich die Ergebnisse, die Sie f\"ur die folgenden
Rechenoperationen/Programmfrag\-mente erwarten. 
Das Ergebnis kann eine Zahl sein, ein syntaktischer Fehler 
(ung\"ultige Sprachelemente) oder
undefiniertes Verhalten des Programmes zur Laufzeit 
(h\"aufig im speziellen: {\it segmentation fault}).
Diskutieren Sie 
Ihre Erwartungen mit Ihrem Nachbarn!

{\footnotesize
\begin{verbatim}
#include <cmath>
using cmath::pow;
#include <iostream>
using std::cout;
#include <string>
using std::string;

int main()
{
   int      intgr;
   double   dbl;

   dbl   = 1.0 / 2.0;               dbl   = pow(3,-4);    
   dbl   = 1. / 2.*3.;              dbl   = 1^4;          
   dbl   = 1. / 2. / 3.;            dbl   = 1<4;          
   intgr = 1 / 3;                   dbl   = 1<<4;         
   dbl   = (1 / 2) + (1 / 2.0);     intgr = 1 % 5;        
   dbl   = 1 / 2+1 / 2;             dbl   = -1 % 5 ;      
   dbl   = 3.0 /2.0;                dbl   = 1 % 5. ;       
   intgr = dbl;                     dbl   = (unsigned) -1;
   dbl   = pow(3.,4.);

   // logic ?
   int i=0;
   if (i=0) 
     cout << "i=0";
   else
     cout << "i!=0";

   // pointer and arrays
   int     a[] = { 1, 2.1, 3, 4, 5 };
   cout << a[0] << " " << a[1] << " " << a[5];
   char    c[] = "hello";
   cout << c[0] << c[1] << c[2] << c[3] << c[4] << c[5];
   string s1("Hello"), s2 = "Hello";
   cout << s1[0] << s1[1] << s1[2] << s1[3] << s1[4] << s1[5];

   for (int i=0; i <=5 ; i++ )
     a[i] = i;

   int *b;    // a will refers to the array above 
   b = a;     b = &a;     b = &a[0];    b = &(a[0]);
   cout << b[4] << " " << *(b+5);
}
\end{verbatim}
}
\noindent Bauen Sie zur Kontrolle die Programmfragmente in ein
lauff\"ahiges Programm ein und stellen sie fest, ob ihre Erwartungen 
richtig waren. Eine Kopie des untenstehenden Textes befindet sich
in {\tt /user0/sts/COMPUTERPHYSIK/BLATT4/fragments.cc}.


\medskip

{\bf Aufgabe 2.\ } {\it G\"ultige Stellenzahl und katastrophale
  Stellenausl\"oschung} \\
Stellen sie fest, wie gro{\ss} $n$ sein kann, so da{\ss} sich $10^n+1$
noch von $10^n$ unterscheidet. F\"uhren sie den
Test mit Zahlen in \\
(i) \verb|float|-Darstellung \\
(ii) in \verb|double|-Darstellung \\
durch. F\"ur die 
S-Bahn-Fahrt: Machen sie sich klar, da{\ss} dadurch viele analytische
Rechenoperationen sowie Konzepte wie $\epsilon$--Umgebungen bei
Gleitkommarechnungen bedeutungslos sind.\\[\medskipamount]

\medskip

{\bf Aufgabe 3.\ } {\it Parameter\"ubergabe ``by value'' und per
  Referenz}\\
Die Fibonacci-Serie $f_i,$ $i=0,1,2\dots$ 
ist durch die folgende iterative Vorschrift
definiert:
\[
  f_i = f_{i-1} + f_{i-2};\quad f_0 = 1, \quad f_1 = 1.
\]
Implementieren Sie die Berechnung dieser Folge durch eine Funktion auf
zwei Weisen:\\
(i) eine Funktion, die die zwei vorhergehenden Werte als Argumente
nimmt und den n\"achsten Wert der Folge zur\"uckliefert. \\
(ii) eine Funktion, die ein weiteres Argument nimmt (als Zeiger oder 
Referenz), um den n\"achsten Wert zur\"uckzuliefern.\\ 
(iii) Erweitern Sie die Funktion aus (ii) so, da\ss{} auch das 
``Weiterschalten'' der Werte der Folge vom Unterprogramm erledigt
wird, d.h. die Werte i-1 und i-2 werden durch i und i-1 ersetzt.\\

\medskip

{\bf Dessert:} {\it freiwillige Erg\"anzung zu Aufgabe 2}\\ 
L\"osen Sie die Gleichung 
\[
ax^2 + b x +c =0 \quad
\mbox{f\"ur} \quad a=1, c=1, b=10^n, \quad n=5,6,7 \dots.
\]
\[
a x^2 + bx +c =0; \quad x_{1,2}=\frac{b\pm \sqrt{b^2-4ac}}{2a}
\]
und vergleichen Sie mit der analytischen N\"aherung f\"ur gro{\ss}e
$b$: $x_{1,2}=b \pm 1.$ L\"osen Sie das Problem mit
\verb|float|- und \verb|double|-Typen. \\
(i) F\" ur welche Werte von $n$ erwarten Sie
bei entsprechender Rechengenauigkeit richtige L\"osungen? 
F\"ur welche Werte erhalten Sie diese richtigen L\"osungen
tats\"achlich?\\
(ii) Implementieren sie die folgende, numerisch korrekte
L\"osungsformel f\"ur quadratische Gleichungen und vergleichen Sie die
Resultate mit den Resultaten der direkten Implementierung
\[
q= - \frac{1}{2} \left[ b + {\rm sign}(b) \sqrt{b^2 - 4ac }\, \right] ; \quad
x1 = \frac{q}{a} ; \quad
x2=  \frac{c}{q}
\]
Diese Vorschrift vermeidet im obigen Fall die sogenannte {\it
  katastrophale Stellenausl\"oschung}, die durch Subtraktion fast
gleich gro{\ss}er Zahlen entsteht.


\vfill
\centerline{Viel Spa\ss{}! 
    \hfill\tt Fragen an: michi,sts@ica1.uni-stuttgart.de}
\end{document}

                                            

