CodeGym /Kurse /Python SELF DE /Arbeiten mit Gleitkommazahlen

Arbeiten mit Gleitkommazahlen

Python SELF DE
Level 5 , Lektion 4
Verfügbar

4.1 Rundung von Gleitkommazahlen

Gleitkommazahlen werden auf Englisch als floating 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 — Mathematik
  • round — rund / runden
  • ceiling — Decke
  • floor — 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

1000000000.000000000 - 0.000000001 1000000000.000000000 
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")
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION