12.5 Gleitkommazahlen – float
Zu Beginn dieses Teils sind wir bereits oberflächlich auf Gleitkommazahlen eingegangen, was wir hier ein wenig vertiefen möchten. Zum Speichern einer Gleitkommazahl mit begrenzter Genauigkeit wird der Datentyp float verwendet.
Wie bereits besprochen wurde, sieht eine Gleitkommazahl im einfachsten Fall folgendermaßen aus:
v = 3.141
Python unterstützt außerdem eine Notation, die es ermöglicht, die Exponentialschreibweise zu verwenden:
v = 3.141e-12
Durch ein kleines oder großes e wird die Mantisse (3.141) vom Exponenten (-12) getrennt. Übertragen in die mathematische Schreibweise, entspricht dies dem Wert 3,141 ⋅ 10–12. Beachten Sie, dass sowohl die Mantisse als auch der Exponent im Dezimalsystem angegeben werden müssen. Andere Zahlensysteme sind nicht vorgesehen, was die gefahrlose Verwendung führender Nullen ermöglicht:
v = 03.141e-0012
Es gibt noch weitere Varianten, eine gültige Gleitkommazahl zu definieren. Dabei handelt es sich um Spezialfälle der oben genannten Notation, weswegen sie etwas exotisch wirken. Sie sollen der Vollständigkeit halber trotzdem erwähnt werden. Pythons interaktiver Modus gibt nach jeder Eingabe ihren Wert aus. Das machen wir uns zunutze und lassen zu jedem Spezialfall den normal formatierten Wert automatisch ausgeben:
>>> -3.
-3.0
>>> .001
0.001
>>> 3e2
300.0
Seit Python 3.6 kann ein Unterstrich verwendet werden, um die Ziffern eines Gleitkommazahl-Literals zu gruppieren:
>>> 3.000_000_1
3.0000001
Eventuell haben Sie gerade schon etwas mit den Gleitkommazahlen experimentiert und sind dabei auf einen vermeintlichen Fehler des Interpreters gestoßen:
>>> 1.1 + 2.2
3.3000000000000003
Aufgrund der Begrenztheit von float können reelle Zahlen nicht unendlich präzise gespeichert werden. Stattdessen werden sie mit einer bestimmten Genauigkeit angenähert. Es ist unter Verwendung der Basisdatentypen nicht möglich, mit beliebig genauen Dezimalzahlen zu rechnen. Dazu muss die Standardbibliothek bemüht werden, was wir zu gegebener Zeit behandeln werden.[ 33 ](Dabei handelt es sich um das Modul decimal, das in Abschnitt 26.3, »Präzise Dezimalzahlen – decimal«, behandelt wird. )
Gleitkommazahlen können als float nicht beliebig genau gespeichert werden. Das impliziert auch, dass es sowohl eine Ober- als auch eine Untergrenze für diesen Datentyp geben muss. Und tatsächlich können Gleitkommazahlen, die in ihrer Größe ein bestimmtes Limit überschreiten, in Python nicht mehr dargestellt werden. Wenn das Limit überschritten ist, wird die Zahl als inf gespeichert[ 34 ](inf steht für infinity (dt. »unendlich«). ) bzw. als -inf, wenn das untere Limit unterschritten wurde. Es kommt also zu keinem Fehler, und es ist immer noch möglich, eine übergroße Zahl mit anderen zu vergleichen:
>>> 3.0e999
inf
>>> -3.0e999
-inf
>>> 3.0e999 < 12.0
False
>>> 3.0e999 > 12.0
True
>>> 3.0e999 == 3.0e999999999999
True
Es ist zwar möglich, zwei unendlich große Gleitkommazahlen miteinander zu vergleichen, jedoch lässt sich nur bedingt mit ihnen rechnen. Dazu folgendes Beispiel:
>>> 3.0e999 + 1.5e999999
inf
>>> 3.0e999 - 1.5e999999
nan
>>> 3.0e999 * 1.5e999999
inf
>>> 3.0e999 / 1.5e999999
nan
Zwei unendlich große Gleitkommazahlen lassen sich problemlos addieren oder multiplizieren. Das Ergebnis ist in beiden Fällen wieder inf. Ein Problem gibt es aber, wenn versucht wird, zwei solche Zahlen zu subtrahieren bzw. zu dividieren. Da diese Rechenoperationen nicht sinnvoll sind, ergeben sie nan. Der Status nan ist vergleichbar mit inf, bedeutet jedoch »not a number«, also so viel wie »nicht berechenbar«.
Beachten Sie, dass weder inf noch nan eine Konstante ist, die Sie selbst in einem Python-Programm verwenden könnten.