diff --git a/assignments/01/ues1_pflug_isabell.tex b/assignments/01/ues1_pflug_isabell.tex index 26bc101..b629754 100644 --- a/assignments/01/ues1_pflug_isabell.tex +++ b/assignments/01/ues1_pflug_isabell.tex @@ -140,15 +140,39 @@ Zeile & Ausdruck & Wert & Typ \\ \midrule \verb|1:| & \verb|int a = 5; int b = 2; double c = b;| \qquad \qquad \qquad & -- & -- \\ - \verb|2:| & \verb|a * b - - - - - - 12.0f| & 22 & \verb|float| \tablefootnote{32-bit single precision floating-point, IEEE-754} \\ - \verb|3:| & \verb|a / b / c| & 1 & \verb|double| \tablefootnote{64-bit double precision floating-point, IEEE-754} \\ - \verb|4:| & \verb|a / c / b| & 1.25 & \verb|double| \\ - \verb|5:| & \verb|-1.0f - a * 2E-1 + a / 2| & 0 & \verb|double| \\ - \verb|6:| & \verb|1.0 + (a *= (2 / - b - (c += .0E2 )))| & -14 & \verb|double| \\ + \verb|2:| & \verb|a * b - - - - - - 12.0f| & \verb|22| & \verb|float| \tablefootnote{32-bit single precision floating-point, IEEE-754} \\ + \verb|3:| & \verb|a / b / c| & \verb|1.0| & \verb|double| \tablefootnote{64-bit double precision floating-point, IEEE-754} \\ + \verb|4:| & \verb|a / c / b| & \verb|1.25| & \verb|double| \\ + \verb|5:| & \verb|-1.0f - a * 2E-1 + a / 2| & \verb|0| & \verb|double| \\ + \verb|6:| & \verb|1.0 + (a *= (2 / - b - (c += .0E2 )))| & \verb|-14| & \verb|double| \\ \bottomrule \end{tabular} \endgroup -\end{table} +\end{table}\parabreak + +Begründungen: +\begin{enumerate}[font=\texttt, label=\arabic*: ] + \setcounter{enumi}{1} + \item \begin{itemize} + \item {\itshape Wert:} Das unäre \verb|-| hat eine höhere Priorität als das \verb|*|, somit werten wir zunächst \verb|- 12.0f| aus, daraufhin dann \verb|-(-12.0f)|, usw., bis dann das letzte \verb|-| als binäres \verb|-| bleibt, welches allerdings eine geringere Priorität als das binäre \verb|*|, wodurch wir also als Zwischenergebnis \verb|a*b - (-12.0f)| stehen haben, und dann nach der Multiplikation die Subtraktion (bzw. Addition) haben. + \item {\itshape Datentyp:} Die Rangfolge der Datentyp-Konvertierung durch Operatoren ist von niedrig nach hoch. Da \verb|a| und \verb|b| integer sind, aber ein \verb|float| im Ausdruck vorkommt, ist \verb|float| der kleinste oberste Datentyp. + \end{itemize} + \item In diesem Ausdruck stehen zwei binäre \verb|/| Operatoren, die aufgrund gleicher Priorität von links nach rechts ausgewertet werden. Da \verb|a / b| eine Operation auf zwei integern ist, ist das Zwischenergebnis dieser Operation ebenfalls ein integer, und zwar \verb|2| (der Rest wird verworfen). \verb|c| ist ebenfalls 2, also rechnen wir am Ende \verb|2 / 2.0|, was \verb|1.0| ergibt, und aufgrund obiger Erklärung diesmal im \verb|double| Format ist. + \item Gleiche Reihenfolge wie in \verb|3:|, doch diesmal sind \verb|c| und \verb|b| vertauscht. Dies führt dazu, dass wir direkt auf den Datentyp \verb|double| springen, und die Division 5/2 diesmal nicht mehr ganzzahlig abläuft. Unser Zwischenergebnis ist also \verb|5 / 2.0 = 2.5|. Das nochmal durch 2 geteilt führt zum Ergebnis von \verb|1.25|, auch wieder im Datenformat \verb|double| + \item \begin{enumerate}[label=\arabic*) ] + \item Unäres \verb|-| bei \verb|-1.0f| + \item Multiplikation von \verb|a * 2E-1 = a * 0.2 = 1.0|, Division von \verb|a / 2 = 2| + \item Addition/Subtraktion \verb|-1.0f - 1.0 + 2 = 0.0| + \end{enumerate} (ich werde mir eine Wiederholung der Erläuterung, warum das wieder \verb|double| ist, diesmal sparen) + \item \begin{enumerate}[label=\arabic*) ] + \item Innerste Klammer wird zuerst ausgewertet: \verb|c += .0E2| $\Leftrightarrow$ \verb|c = c + (.0E2)| $\Leftrightarrow$ \verb|c = 2.0 + 0.0| $\Leftrightarrow$ \verb|c = 2.0| + \item Unäres \verb|-| bei \verb|-b| $\curvearrowright$ \verb|2 / (-2) - (2.0)| + \item Division: \verb|2 / (-2) = -1| + \item Addition: \verb|-1 - (2.0) = -3.0| + \item Multiplikations-Zuweisungs-Kombi-Dingens: \verb|a *= (-3.0)| $\Leftrightarrow$ \verb|a = a * (-3.0)| $\Leftrightarrow$ \verb|a = 5 * (-3.0)| $\Leftrightarrow$ \verb|a = -15.0| + \item Addition: \verb|1.0 + (-15.0) = -14.0| + \end{enumerate} +\end{enumerate} \pagebreak \Aufgabe