lehrkraefte:blc:informatik:ffprg1-2020:zahlvar

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:ffprg1-2020:zahlvar [2020/01/26 11:43] – [Rundungsregel] Ivo Blöchligerlehrkraefte:blc:informatik:ffprg1-2020:zahlvar [2022/02/10 13:54] (current) – [Rundungsregel] Ivo Blöchliger
Line 1: Line 1:
 +====== Variablen mit Zahlen, Formatierte Ausgabe ======
 +Programme, sollen natürlich verschiedene Dinge tun können. Dazu werden die Daten in Variablen gespeichert und dann mit den Variablen gerechnet.
  
 +<code python zahlvar.py>
 +a=3
 +b=4
 +
 +c=(a**2+b**2)**0.5
 +
 +print("%f im Quadrat plus %f im Quadrat gibt %f im Quadrat." % (a,b,c))
 +print("%d im Quadrat plus %d im Quadrat gibt %d im Quadrat." % (a,b,c))
 +print("%d im Quadrat plus %.2f im Quadrat gibt %.4f im Quadrat." % (a,b,c))
 +</code>
 +  * Studieren Sie den obigen Output
 +  * Ändern Sie die Werte für a und b und studieren Sie den Output.
 +
 +===== Format-Strings=====
 +Format-Strings erlauben auf eine bequeme Art und Weise die Ausgabe von Zahlen festzulegen. Der Syntax ist immer der Formatstring (zwischen Anführungszeichen), gefolgt vom Modulo-Operator ''%'', gefolgt von einer Liste mit Werten, die dann im Formatstring die %-Platzhalter ersetzen. Diese Platzhalter sind
 +  * %d Ganzahlen
 +  * %f Dezimalzahlen (Ausgabe mit 6 Nachkommastellen)
 +  * %s Zeichenketten (Strings)
 +  * Modifikatoren: 
 +    * %.2f  Anzahl Nachkommastellen (hier 2)
 +    * %5.3f  Fünf Stellen vor dem Komma (mit Leerschlägen füllen) und 3 nach dem Komma
 +    * %04d  Vier Stellen für Ganzzahl, mit führenden Nullen aufgefüllt.
 +
 +Es gibt noch viel mehr Möglichkeiten und Varianten. [[https://docs.python.org/2/library/stdtypes.html#string-formatting|Siehe offizelle Dokumentation]]. In Python3 wird zwar eine andere Variante mit ''.format()'' empfohlen. Die hier präsentierte Variante ist aber so auch in vielen anderen Programmiersprachen möglich, z.B. in C++, die für die Programmierung von Mikrocontrollern sehr populär ist.
 +
 +
 +====== Aufgaben ======
 +  * Definieren Sie 3 Variablen k (Kapital), p (Zinsatz) und n (Anzahl Jahre). Das Programm soll das mit Zinseszins verzinste Kapital nach n Jahren auf 2 Kommastellen gerundet ausgeben. Die Ausgabe soll z.B. wie folgt aussehen: (% wird mit <nowiki>%%</nowiki> ausgegeben)
 +
 +<code>
 +Nach 20 Jahren ist das Kapital von 100.00 mit einem Zins von 1.0% auf 122.02 angewachsen.
 +</code>
 +
 +  * Definieren Sie 2 Variablen m (Masse in kg) und g (Körpergrösse in cm). Das Programm soll den BMI (Body-Mass Index) auf eine Nachkommastelle gerundet ausgeben. Z.B. so:
 +<code>
 +Bei 50 kg Gewicht und der Grösse 160 cm beträgt der bmi 19.5
 +</code>
 +
 +<hidden Lösungsvorschläge>
 +<code python zinseszins.py>
 +k=100
 +p=1
 +n=20
 +kn = k*(1+p/100)**n
 +print("Nach %d Jahren ist das Kapital von %.2f mit einem Zins von %.1f%% auf %.2f angewachsen." % (n,k,p,kn))
 +</code>
 +<code python bmi.py>
 +m=50
 +g=160
 +bmi = ja das müssen Sie schon selber googeln :-P
 +print("Bei %.f kg Gewicht und der Grösse %d cm beträgt der bmi %.1f" % (m,g,bmi))
 +</code>
 +</hidden>
 +
 +====== Quizz ======
 +Was ist jeweils die Ausgabe folgender Zeilen? Können Sie das ohne die Zeilen auszuführen?
 +<quizlib id="quiz" rightanswers="['3, 3.140000', '007', '0.67']" submit="Check Answers">
 +    <question title="&lt;pre&gt;print(&quot;%d, %f&quot; % (3.14, 3.14))&lt;/pre&gt;" type="text"></question>
 +    <question title="&lt;pre&gt;print(&quot;%03d&quot; % 7.92)&lt;/pre&gt;" type="text"></question>
 +    <question title="&lt;pre&gt;a=2&#xa;b=3&#xa;print(&quot;%.2f&quot; % (a/b))&lt;/pre&gt;" type="text"></question>
 +</quizlib>
 +
 +
 +====== Dokumentation und Kuriositäten ======
 +Die %f, %s und %d Formatierungen sind in vielen Programmiersprachen und Programmen implementiert und öfter mal praktisch zu kennen.
 +
 +Die neue Python-Variante verwendet .format, das noch mehr Flexibilität bietet: Siehe https://pyformat.info/
 +
 +===== Rundungsregel =====
 +"%.2f" rundet mit der [[https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules|Ties to even rule]], so ergibt z.B.
 +    * ''"%.1f" % 0.25 -> "0.2"''
 +  * ''"%.1f" % 0.75 -> "0.8"''
 +  * Achtung: Viele Zahlen, die mit abbrechenden Dezimalbrüchen dargestellt werden können, können im Binärsystem als Binärbruch nicht abbrechend dargestellt werden (wie z.B. 1/10). Diese Zahlen erscheinen deshalb «zufällig» gerundet. Wie z.B.
 +    * ''"%.1f" % 0.35 -> "0.3"'' (anstatt 0.4 wie mit der "Ties to even" Regel erwartet). Der Grund ist, dass ''"%.20f" % 0.35 -> "0.34999999999999997780"'' und damit wird abgerundet.
 +    * ''"%.1f" % 0.65 -> "0.7"'' (anstatt 0.6). Grund ''"%.20f" % 0.65 ->  "0.65000000000000002220"''
 +===== Rechenungenauigkeit =====
 +Was ist die Ausgabe (10 Summanden 0.1):
 +<code python>
 +print("%.20f" % (0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1))
 +</code>
 +
 +Erklärung: $\frac{1}{10}$ kann im Zweiersystem nicht abbrechend dargestellt werden (wie z.B. $\frac{1}{3}$ im Dezimalsystem). D.h. es werden zwangsläufig Rechenfehler gemacht, die sich aber oft nur auf letzte von ca. 17 Dezimalstellen auswirken.
 +
 +Weitere Beispiele sind folgende, wo 17 Stellen Genauigkeit nicht ausreichen:
 +<code python>
 +print("%f" % 10000000000.2)
 +# produziert 10000000000.200001
 +print("%f" % 100000000000.2)
 +# produziert 100000000000.199997
 +</code>