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 16:10]
Ivo Blöchliger [Rechenungenauigkeit]
lehrkraefte:blc:informatik:ffprg1-2020:zahlvar [2022/02/10 14:54] (current)
Ivo Blöchliger [Rundungsregel]
Line 1: Line 1:
-====== Variablen mit Zahlen ======+====== 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. Programme, sollen natürlich verschiedene Dinge tun können. Dazu werden die Daten in Variablen gespeichert und dann mit den Variablen gerechnet.
  
Line 15: Line 15:
   * Ändern Sie die Werte für a und b und studieren Sie den Output.   * Ändern Sie die Werte für a und b und studieren Sie den Output.
  
-===== Formatierungen =====+===== 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   * %d Ganzahlen
-  * %f Dezimalzahlen+  * %f Dezimalzahlen (Ausgabe mit 6 Nachkommastellen)
   * %s Zeichenketten (Strings)   * %s Zeichenketten (Strings)
   * Modifikatoren:    * Modifikatoren: 
-    * %.2f  Anzahl Nachkommastellen+    * %.2f  Anzahl Nachkommastellen (hier 2)
     * %5.3f  Fünf Stellen vor dem Komma (mit Leerschlägen füllen) und 3 nach dem Komma     * %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.     * %04d  Vier Stellen für Ganzzahl, mit führenden Nullen aufgefüllt.
  
-Es gibt noch viel mehr Möglichkeiten und Varianten. +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.
  
  
Line 57: Line 58:
 ====== Quizz ====== ====== Quizz ======
 Was ist jeweils die Ausgabe folgender Zeilen? Können Sie das ohne die Zeilen auszuführen? Was ist jeweils die Ausgabe folgender Zeilen? Können Sie das ohne die Zeilen auszuführen?
-<quizlib id="quiz" rightanswers="['3, 3.14', '007', '0.67']" submit="Check Answers">+<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;%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;print(&quot;%03d&quot; % 7.92)&lt;/pre&gt;" type="text"></question>
Line 64: Line 65:
  
  
-====== Dokumentation ======+====== Dokumentation und Kuriositäten ======
 Die %f, %s und %d Formatierungen sind in vielen Programmiersprachen und Programmen implementiert und öfter mal praktisch zu kennen. Die %f, %s und %d Formatierungen sind in vielen Programmiersprachen und Programmen implementiert und öfter mal praktisch zu kennen.
  
Line 71: Line 72:
 ===== Rundungsregel ===== ===== Rundungsregel =====
 "%.2f" rundet mit der [[https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules|Ties to even rule]], so ergibt z.B. "%.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.25 -> "0.2"'' 
-  * "%.1f" % 0.35 -> "0.4" +  * ''"%.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 ===== ===== Rechenungenauigkeit =====
 Was ist die Ausgabe (10 Summanden 0.1): Was ist die Ausgabe (10 Summanden 0.1):
Line 81: Line 84:
  
 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. 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>
  • lehrkraefte/blc/informatik/ffprg1-2020/zahlvar.1580051455.txt.gz
  • Last modified: 2020/01/26 16:10
  • by Ivo Blöchliger