====== Überraschende Rechnungen ====== ===== Rechnen mit Uhrzeiten konkret ===== 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: p = 1 for a in range(36): print("2^%d = %d" % (a,p)) p *= 2 In vielen anderen Sprachen muss man aber aufpassen, beispielsweise in C, wie die folgende Box illustriert. 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): 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 #include 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; } ===== 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!) 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) ===== 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]]