lehrkraefte:snr:informatik:bits-and-bytes:ueberraschende-rechnungen

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:snr:informatik:bits-and-bytes:ueberraschende-rechnungen [2022/02/15 21:33] Olaf Schnürerlehrkraefte:snr:informatik:bits-and-bytes:ueberraschende-rechnungen [2022/02/15 21:47] (current) – [Rechnen mit Kommazahlen] Olaf Schnürer
Line 1: Line 1:
 +====== Überraschende Rechnungen ======
 +
 +===== Rechnen mit Uhrzeiten konkret =====
 +
 +
 +<WRAP center round info>
 +Python bzw. Tigerjython passt auf, wenn die Zahlen zu gross werden, und kann mit recht grossen Zahlen rechnen. Beispielsweise läuft das folgende Programm problemlos:
 +<code python>
 +p = 1
 +for a in range(36):
 +    print("2^%d = %d" % (a,p))
 +    p *= 2
 +</code>
 +
 +In vielen anderen Sprachen muss man aber aufpassen, beispielsweise in C, wie die folgende Box illustriert.
 +</WRAP>
 +
 +<WRAP center round important>
 +Unten folgt ein Programm in der Programmiersprache C, das zeigt, dass der Datentyp ''int'' alias Integer (vermeintlich ganze Zahl) in Wirklichkeit eine Zahl/Uhrzeit auf der Uhr mit $2^{32}$ Zeiten ist, wobei man die "linke Hälfte" der Uhr als negative Zahlen/Uhrzeiten interpretiert. Mit anderen Worten kann ein Integer in C Werte zwischen $-2^{31} = -2'147'483'648$ und $2^{31}-1 = 2'147'483'647$ annehmen und gerechnet wird modulo $2^{32}=4'294'967'296$. 
 +
 +Hier ist die Ausgabe des Programms (erster Block: Zweierpotenzen, plötzlich negativ, dann Null; zweiter Block: Übergang von der "rechten, positiven Hälfte der Uhr" auf die "linke, negative Hälfte" und später zurück; dritter+vierter Block: ähnlich beim Multiplizieren von Zahlen, die gar nicht schrecklich gross sind):
 +<code>
 +zwei hoch     0 ist            1
 +zwei hoch     1 ist            2
 +zwei hoch     2 ist            4
 +zwei hoch     3 ist            8
 +zwei hoch     4 ist           16
 +zwei hoch     5 ist           32
 +zwei hoch     6 ist           64
 +zwei hoch     7 ist          128
 +zwei hoch     8 ist          256
 +zwei hoch     9 ist          512
 +zwei hoch    10 ist         1024
 +zwei hoch    11 ist         2048
 +zwei hoch    12 ist         4096
 +zwei hoch    13 ist         8192
 +zwei hoch    14 ist        16384
 +zwei hoch    15 ist        32768
 +zwei hoch    16 ist        65536
 +zwei hoch    17 ist       131072
 +zwei hoch    18 ist       262144
 +zwei hoch    19 ist       524288
 +zwei hoch    20 ist      1048576
 +zwei hoch    21 ist      2097152
 +zwei hoch    22 ist      4194304
 +zwei hoch    23 ist      8388608
 +zwei hoch    24 ist     16777216
 +zwei hoch    25 ist     33554432
 +zwei hoch    26 ist     67108864
 +zwei hoch    27 ist    134217728
 +zwei hoch    28 ist    268435456
 +zwei hoch    29 ist    536870912
 +zwei hoch    30 ist   1073741824
 +zwei hoch    31 ist  -2147483648
 +zwei hoch    32 ist            0
 +zwei hoch    33 ist            0
 +zwei hoch    34 ist            0
 +zwei hoch    35 ist            0
 +
 +  2147483647
 + -2147483648
 + -2147483647
 +
 +       32768
 +       65536
 +
 +  1073741824
 + -2147483648
 +           0
 +</code>
 +
 +<code c> 
 +#include <stdio.h>
 +  
 +int main()
 +{
 +  int p = 1;
 +  int a;
 +  for (a = 0; a < 36; a = a + 1) {
 +    printf("zwei hoch %5d ist %12d\n", a, p);
 +    p = p * 2;
 +  }
 +  printf("\n");
 +
 +  /* 2 hoch 31 minus 1*/
 +  int x = 2147483647;
 +
 +  printf("%12d\n", x);
 +  printf("%12d\n", x+1);
 +  printf("%12d\n", x+2);
 +  printf("\n");
 +  
 +  /* 2 hoch 15 */
 +  int m = 32768;
 +
 +  /* 2 hoch 16 */
 +  int n = 65536;
 +
 +  printf("%12d\n", m);
 +  printf("%12d\n", n);
 +
 +  printf("\n");
 +  
 +  printf("%12d\n", m * m);
 +  printf("%12d\n", m * n);
 +  printf("%12d\n", n * n);
 +  
 +  return 0;
 +}
 +</code>
 +</WRAP>
 +
 +===== Rechnen mit Kommazahlen =====
 +
 +  * **Achtung: Rechenfehler beim Rechnen mit Kommazahlen auf dem Computer!** (Da der Computer manchmal Nachkommastellen abschneidet, auch wenn man das vom Dezimalsystem her nicht erwarten würde; beispielsweise ist $0,1$ dezimal im Binärsystem eine nicht-abbrechende Kommazahl!)
 +
 +<WRAP center round important>
 +<code python>
 +x = 0.1+0.2
 +y = 0.3
 +
 +print(x)
 +print(y)
 +
 +if x==y:
 +    print("Die beiden Zahlen sind gleich.")
 +else:
 +    print("Die beiden Zahlen sind NICHT gleich.")
 +    
 +
 +print("%.20f" % x)
 +print("%.20f" % y)
 +</code>
 +</WRAP>
 +
 +===== Wie der Computer binäre Kommazahlen speichert =====
 +
 +siehe Grafik auf [[https://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating-point_format:_binary64| Wikipedia: Double-precision]]
 +
 +===== Link zur Kursseite =====
 +
 +[[lehrkraefte:snr:informatik:glf21|Zur Kursseite]]