Python: Division von Gleitkomma- und komplexen Zahlen

9 August, 2012

Eric Lippmann
Eric Lippmann
CTO

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.

von | Aug. 9, 2012

Der Divisionsoperator (/) in Python 2.x hat, abhängig von seinen Argumenten, unterschiedliche Bedeutung: Teilt man (Long) Integer, erhält man das abgerundete Ergebnis, bei Gleitkomma- (Float) oder komplexen Zahlen eine genügend präzise Annäherung. Erwartet man beispielsweise Float, verwendet aber selbst oder durch Eingabe Integer, kann das zu unerwartenden Verhalten führen:

[elippmann@ws-elippmann ~]$ python
Python 2.7.3 (default, Jul 24 2012, 10:05:38)
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a, b = 5, 10
>>> a / b

Wenn als Eingabe verschiedene numerische Datentypen erlaubt sind, müssen wir bei der Berechnung sicherstellen, dass das Ergebnis eine Gleitkommazahl ist:

>>> float(a) / b
0.5

Komplexe Zahlen, können mit dieser Methode aber nicht verarbeitet werden:

>>> c = 4j
>>> float(c) / b
Traceback (most recent call last):
File "", line 1, in
TypeError: can't convert complex to float

Um Vorzeichen beizubehalten und alle numerischen Datentypen verabeiten zu können, ist nur die Multiplikation mit 1.0 richtig:

>>> c * 1.0 / b
0.4j

In Python 3 ist das alles nicht mehr nötig, da Ergebnisse automatisch Gleitkommazahlen sind. Ab Python 2.2 kann dieses Verhalten aktiviert werden, indem das entsprechende Feature aus dem __future__-Modul aktiviert wird:

>>> from __future__ import division
>>> a / b
0.5
>>> c / b
0.4j

Zum Abschluss noch ein Hinweis: Wer wirklich Integer-Division verwenden möchte, sollte auch den entsprechneden Operator benutzen, ehe nach Konvertierung des Code zu Python 3, böse Überraschungen warten:

>>> a // b
>>> float(a) // b
0.0
>>> c // b
0j

Zum Weiterlesen:

Events

Professional Services

Web Services

0 Kommentare

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Wie hat Dir unser Artikel gefallen?