\documentclass[12pt,a4paper,pdftex, answers]{exam}

\usepackage[german]{babel}
\usepackage{natbib}
\usepackage{graphicx}
\usepackage[small]{caption}
\usepackage{sidecap}
\usepackage{pslatex}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{lipsum}
\setlength{\marginparwidth}{2cm}
\usepackage[breaklinks=true,bookmarks=true,bookmarksopen=true,pdfpagemode=UseNone,pdfstartview=FitH,colorlinks=true,citecolor=blue]{hyperref}

%%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
\pagestyle{headandfoot}
\header{{\bfseries\large \"Ubung 1}}{{\bfseries\large Variablen und Datentypen}}{{\bfseries\large 12. Oktober, 2015}}
\firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email:
  jan.grewe@uni-tuebingen.de}
\runningfooter{}{\thepage}{}

\setlength{\baselineskip}{15pt}
\setlength{\parindent}{0.0cm}
\setlength{\parskip}{0.3cm}
\renewcommand{\baselinestretch}{1.15}

\newcommand{\code}[1]{\texttt{#1}}
\renewcommand{\solutiontitle}{\noindent\textbf{L\"osung:}\par\noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
\begin{document}

\vspace*{-6.5ex}
\begin{center}
  \textbf{\Large Einf\"uhrung in die wissenschaftliche Datenverarbeitung}\\[1ex]
  {\large Jan Grewe, Jan Benda}\\[-3ex]
  Abteilung Neuroethologie \hfill --- \hfill Institut f\"ur Neurobiologie \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\
\end{center}

Die folgenden Aufgaben dienen der Wiederholung, \"Ubung und
Selbstkontrolle und sollten eigenst\"andig bearbeitet und gel\"ost
werden. Die L\"osung soll in Form eines einzelnen Skriptes (m-files)
im ILIAS hochgeladen werden. Jede Aufgabe sollte in einer eigenen
``Zelle'' gel\"ost sein. Die Zellen \textbf{m\"ussen} unabh\"angig
voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster:
``variablen\_datentypen\_\{nachname\}.m'' benannt werden
(z.B. variablen\_datentypen\_mueller.m).

\begin{questions}

  \question Erzeugen und L\"oschen von Variablen:
  \begin{parts}
    \part Erzeuge zwei Variablen \code{a}, \code{b} und weise ihnen
    unterschiedliche Werte zu. Schlie{\ss}e die Zeilen mit einem
    Semikolon ab. Erstelle eine Variable \code{c} die leer ist.
    \begin{solution}
      \code{a = 1;}, \code{b = 2;}, \code{c = [];}
    \end{solution}
    \part Lass die Werte der Variablen ausgeben.
    \begin{solution}
      \code{disp(a)}, \code{disp(b)}, \code{disp(c)}
    \end{solution}
    \part Benuzte die Kommandozeile um herauszufinden, welche Variablen
    es im Workspace gibt.
    \begin{solution}
      \code{who}
    \end{solution}
    \part Benuzte die Kommandozeile um herauszufinden, welche Datentypen sie haben.
    \begin{solution}
      \code{whos} oder \code{class(a)}, \code{class(b)}, \code{class(c)}
    \end{solution}
    \part Finde in der Hilfe mehr Information \"uber das \code{clear} Kommando.
    \begin{solution}
      \code{help clear}
    \end{solution}
    \part L\"osche eine Variable.
    \begin{solution}
      \code{clear a}
    \end{solution}
    \part L\"osche alle \"ubrigen Variablen.
    \begin{solution}
      \code{clear all} oder einfach \code{clear}
    \end{solution}
  \end{parts}

  \question Operationen auf Variablen:
  \begin{parts}
    \part Erstelle die Variablen \code{a} und \code{b} und weise ihnen
    beliebige Werte zu.
    \begin{solution}
      \code{a = 5; b = 3.14;}
    \end{solution}
    \part Addiere beliebige andere Zahlen zu den Variablen  \code{a} und \code{b}.
    \begin{solution}
      \code{a + 5}, \code{b + 7.28}
    \end{solution}
    \part Addiere die Variablen.
    \begin{solution}
      \code{a + b}
    \end{solution}
    \part Mulipliziere die Variablen miteinander.
    \begin{solution}
      \code{a * b}
    \end{solution}
    \part \"Andern sich die urspr\"unglichen Werte der Variablen?
    \begin{solution}
      Nein, die Operationen benutzen die Werte der Variablen. Die
      Variablen bleiben unver\"andert.
    \end{solution}
    \part F\"uhre eine beliebige Berechnungen mit den Variablen aus und
    weise die Ergebnisse einer neuen Variable \code{x} zu.
    \begin{solution}
      \code{x = a * b;}
    \end{solution}
    \part Weise \code{a} und \code{b} neue Werte zu. Hat sich etwas am
    Wert von \code{x} ge\"andert?
    \begin{solution}
      Nein, der Variablen \code{x} wird ein Wert zugewiesen, der sich
      nicht \"andert bis der Variablen ein neuer Wert zugewiesen
      wird. Die Variable 'x' speichert das Resultat der Rechnung
      \textbf{nicht} die Anweisung.
    \end{solution}
  \end{parts}

  \question Berechne die Fakult\"at von 5:
  \begin{parts}
    \part Erzeuge eine Variable \code{x} und weise ihr den Wert 1 zu.
    \part Berechne den ersten Schritt (\code{*2}) und weise das Ergebnis \code{x}
    zu.
    \part Fahre schrittweise fort, bis die Fakult\"at von 5 berechnet ist. \code{x}
    sollte nun das Endergebnis enthalten.
  \end{parts}
  \begin{solution}
    \code{x = 1;} \\ \code{x = x * 2;}\\ \code{x = x * 3;} \\ \code{x = x * 4;} \\ \code{x = x * 5;}\\ code{disp(x)}\\
    \code{  120}
  \end{solution}

  \question Erstelle eine Variable, die einen beliebigen Text enth\"alt. Was
  ist ihr Datentyp?
  \begin{solution}
  \code{x = 'einfacher Text'}\\ \code{class(x)\\ char}
  \end{solution}
  
  \question Was sind die gr\"o{\ss}ten Zahlen, die in den Integer 8, 16, 32
  und 64 bit Datentypen abgelegt werden k\"onnen?
  \begin{solution}
    \verb+2^8 / 2 - 1+\\
    \verb+2^16 / 2 - 1+\\
    \verb+2^32 / 2 - 1+\\
    \verb+2^64 / 2 - 1+
  \end{solution}
  
  \question Erstelle eine Variable des 8 Bit Integer Datentyps und weise
  ihr einen Wert zu. Addiere \code{300}. Welchen Wert enth\"alt nun die
  Variable? Warum?
  \begin{solution}
    \code{x = int8(35);\\x = x + 300;\\ disp(x)\\ 127}\\
    Der Datentype int8 kann nur Werte von -128 bis 127 speichern.
  \end{solution}
  
  \question Erkl\"are die Ausgaben von \code{int8(1024)} und \code{uint8(1024)}.
  \begin{solution}
    Der int8 Datentyp kann Werte von -128 bis maximal 127 ablegen. Der
    uint8 Typ ist \textit{unsigned}, er speichert Werte zwischen 0 und
    255.
  \end{solution}

  \question Typkonvertierung:
  \begin{parts}
    \part F\"uhre aus: \code{x = 131.333}. Welchen Datentyp hat die
    Variable \code{x}?
    \begin{solution}
      Sie hat den Typ \textit{double}.
    \end{solution}
    \part Wandle \code{x} in den speichereffizientesten Integer Datentypen um.
    \begin{solution}
      \code{x = uint8(x);}\\Ben\"otigt 8 bit anstelle der 64 bit f\"ur
      den double.
    \end{solution}
    \part Welchen Wert hat nun \code{x} ?
    \begin{solution}
      131
    \end{solution}
  \end{parts}

  \question Flie{\ss}kommazahlen 1: Endliche Pr\"azision bei Addition
  \begin{parts}
    \part Weise der Variablen \code{a} eine Zahl mit Nachkommastellen zu.
    \begin{solution}
      \code{a = 3.14;}
    \end{solution}
    \part Eine weitere Variable \code{b} soll den Wert \code{a+0.001}
    haben. Was ist das Ergebnis von \code{b-a} ?
    \begin{solution}
      \code{b = a + 0.001;}\\ \code{disp(b - a)\\0.001}\\
      Alles ok, Ergebnis wie erwartet.
    \end{solution}
    \part Einer dritte Variable \code{c} soll der Wert \code{a+1e-16}
    zugewiesen werden. Was ist das Ergebnis von \code{c-a} ? Warum?
    \begin{solution}
      Das Ergebnis ist 0! Auch die double Werte haben nur eine endliche
      P\"azision in den Nachkommastellen.
    \end{solution}
    \part Berechne \verb=(2^52 + 1) - 2^52= sowie
    \verb=(2^53 + 1) - 2^53=.
    \begin{solution}
      Im Ersten Fall ist das Ergebnis = 1, im Zweiten = 0. Bei so
      gro{\ss}en Zahlen k\"onnen so kleine Unterschiede nicht mehr
      aufgel\"ost werden.
    \end{solution}
    \part Berechne \code{sqrt(1+1e-16)-1} . Ist das richtig? Warum?
    \begin{solution}
      Die Wurzel von 1 + etwas sollte nicht 1 sein! Das Ergebnis
      sollte nicht 0 sein.  Vergleiche beim Addieren einer etwas
      gr\"o{\ss}eren Zahl (z.B. 1e-8).
    \end{solution}
  \end{parts}

  \question Flie{\ss}kommazahlen 2: Endliche Pr\"azision bei Multiplikation
  \begin{parts}
    \part Weise der Variablen \code{a} die Zahl \code{4/3} zu.
    \part Die Variable \code{b} soll den Wert \code{3*(a-1)} erhalten.
    \part Welches Ergebnis erwartest du f\"ur \code{b-1} ?
    \begin{solution}
      \code{a = 4/3;}\\ \code{b = 3 * (a-1)}\\ 
      b sollte nun 1 sein. d.h., \code{b-1} sollte 0 sein.
    \end{solution}
    \part Berechne mit matlab \code{b-1} !
    \begin{solution}
      \code{disp(b - 1)\\ -2.2204e-16}\\ Aufgrund von Rundungsfehlern
      kommt es zu diesem Ergebnis.
    \end{solution}
    \part Was sollte \code{sin(pi)} ergeben ? Was sagt matlab?
    \begin{solution}
      Sollte 0 sein, ist es aber nicht. Wie oben, Rundungsfehler
      f\"uhren zu diesen Abweichungen.
    \end{solution}
  \end{parts}

\end{questions}

\end{document}