4.1 Rundung von Gleitkommazahlen
Gleitkommazahlen werden auf Englisch als float
ing point number bezeichnet — Zahlen mit Gleitkomma: In den USA wird zur Trennung von Ganzzahl und Dezimalteil ein Punkt verwendet. Daher der Name float
.
Wie wir bereits besprochen haben, wird bei der Umwandlung einer Gleitkommazahl (float) in eine Ganzzahl (int) immer abgerundet – der Dezimalteil wird einfach weggelassen. Aber man kann sich leicht eine Situation vorstellen, in der eine Gleitkommazahl einfach zur nächsten Ganzzahl gerundet werden muss. Was tun in so einer Situation?
Dafür gibt es in Python die eingebaute Funktion round()
. Sie wurde noch vor der Erstellung der math-Bibliothek erfunden, deshalb gehört sie nicht dazu. Funktionen zum Abrunden und Aufrunden befinden sich in der math-Bibliothek.
Die Funktion round()
rundet die Zahl zur nächsten Ganzzahl:
round(gleitkommazahl)
Diese Funktion gibt die Ganzzahl zurück, der die übergebene Gleitkommazahl am nächsten liegt. Wichtig zu beachten ist, dass wenn der Dezimalteil der Zahl 0,5 beträgt, die Funktion round()
die Methode des Rundens zur nächsten geraden Ganzzahl verwendet. Dies wird als "Bankenrundung" bezeichnet und ermöglicht die systematische Fehlerreduktion bei wiederholtem Runden. Zum Beispiel:
Beispiele:
Befehl | Ergebnis |
---|---|
x = round(4.1) | 4 |
x = round(4.5) | 4 |
x = round(4.9) | 5 |
x = round(5.5) | 6 |
Die Funktion math.ceil()
rundet die Zahl zur nächsten Ganzzahl auf, Beispiele:
Befehl | Ergebnis |
---|---|
x = math.ceil(4.1) | 5 |
x = math.ceil(4.5) | 5 |
x = math.ceil(4.9) | 5 |
Die Funktion math.floor()
rundet die Zahl zur nächsten Ganzzahl ab, Beispiele:
Befehl | Ergebnis |
---|---|
x = math.floor(4.1) | 4 |
x = math.floor(4.5) | 4 |
x = math.floor(4.9) | 4 |
Obwohl es einfacher ist, die Typkonvertierungsfunktion int()
zu verwenden, um eine Zahl abzurunden:
Befehl | Ergebnis |
---|---|
x = int(4.9) | 4 |
Wenn es dir schwerfällt, diese Befehle zu merken, hilft ein kleiner Englischunterricht:
math
— Mathematikround
— rund / rundenceiling
— Deckefloor
— Boden
4.2 Aufbau von Gleitkommazahlen
Der Typ float
in Python kann Werte im Bereich von -1,7*10308 bis +1,7*10308 speichern. Dieser riesige Wertebereich erklärt sich dadurch, dass der Typ float
ganz anders aufgebaut ist als Ganzzahlen. Jede Variable des Typs float enthält zwei Zahlen: die erste wird als Mantisse bezeichnet, und die zweite — als Exponent.
Angenommen, wir haben die Zahl 123456789 und haben diese in einer Variable des Typs float
gespeichert. Dann wird die Zahl in die Form 1.23456789*108 umgewandelt, und im Typ float
werden zwei Zahlen gespeichert — 23456789 und 8. Rot ist der „signifikante Teil der Zahl“ (Mantisse), grün der Exponent.
Dieser Ansatz ermöglicht das Speichern sowohl sehr großer als auch sehr kleiner Zahlen. Aber da die Zahlengröße auf 8 Byte (64 Bit) begrenzt ist und ein Teil der Bits zur Speicherung des Exponenten (sowie des Vorzeichens der Zahl und des Exponentenvorzeichens) verwendet wird, ist die maximale Länge der Mantisse auf 15 Ziffern begrenzt.
Dies ist eine sehr vereinfachte Beschreibung des Aufbaus von Gleitkommazahlen. Eine vollständigere kann man googeln.
4.3 Genauigkeitsverlust bei der Arbeit mit Gleitkommazahlen
Bei der Arbeit mit Gleitkommazahlen muss man sich immer bewusst sein, dass Gleitkommazahlen — ungenau sind. Es wird immer Rundungsfehler, Umwandlungsfehler
von Dezimal- in Binärsystem geben und schließlich das häufigste — Genauigkeitsverlust
bei der Addition/Subtraktion von Zahlen zu unterschiedlichen Größenordnungen.
Das letzte ist die unerwartetste Situation für Programmieranfänger.
Wenn man von der Zahl 109 1/109 subtrahiert, erhält man wieder 109.
Subtraktion von Zahlen zu unterschiedlichen Größenordnungen | Erklärung |
---|---|
|
Die zweite Zahl ist zu klein, und ihr signifikanter Teil wird ignoriert (ausgegraut). Orangene kennzeichnen 15 signifikante Ziffern. |
Was soll ich sagen, Programmieren ist keine Mathematik.
4.4 Gefahr beim Vergleich von Gleitkommazahlen
Eine weitere Gefahr lauert für Programmierer beim Vergleich von Gleitkommazahlen. Da bei der Arbeit mit diesen Zahlen Rundungsfehler auftreten können, sind Situationen möglich, in denen Gleitkommazahlen gleich sein sollten, es aber nicht sind. Und umgekehrt: Zahlen sollten nicht gleich sein, aber sie sind gleich.
Beispiel:
Befehl | Erklärung |
---|---|
a = 1000000000.0 b = 0.000000001 c = a – b | In der Variablen a wird der Wert 1000000000.0 sein In der Variablen c wird der Wert 1000000000.0 sein (die Zahl in der Variablen b ist zu klein) |
Im obigen Beispiel sollten a und c nicht gleich sein, aber sie sind es.
Oder nehmen wir ein anderes Beispiel:
Befehl | Erklärung |
---|---|
a = 1.00000000000000001 b = 1.00000000000000002 | In der Variablen a wird der Wert 1.0 sein In der Variablen b wird der Wert 1.0 sein |
In der Praxis werden Gleitkommazahlen wie folgt verglichen:
Es wird eine sehr kleine Zahl genommen. Wenn der Unterschied der Zahlen (im Betrag) kleiner ist als diese kleine Zahl, werden sie als gleich angesehen. Beispiel:
a = 0.00000000012
b = 0.000000000011
if abs(a - b) < 0.00001:
print("gleich")
else:
print("nicht gleich")
GO TO FULL VERSION