Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 14 Mathematik
  Pfeil 14.1 Mathematische Funktionen – math, cmath
  Pfeil 14.2 Zufallszahlengenerator – random
  Pfeil 14.3 Präzise Dezimalzahlen – decimal
    Pfeil 14.3.1 Verwendung des Datentyps
    Pfeil 14.3.2 Nichtnumerische Werte
    Pfeil 14.3.3 Das Context-Objekt


Galileo Computing - Zum Seitenanfang

14.3 Präzise Dezimalzahlen – decimal  Zur nächsten ÜberschriftZur vorigen Überschrift

Sicherlich erinnern Sie sich noch an folgendes Beispiel, das zeigen sollte, dass der eingebaute Datentyp float nicht unendlich präzise ist:

>>> 0.9 
0.90000000000000002

Das liegt daran, dass nicht jede Dezimalzahl durch das interne Speichermodell von float dargestellt werden kann, sondern nur mit einer gewissen Genauigkeit angenähert wird. Diese Einschränkung wird jedoch aus Gründen der Effizienz in Kauf genommen. Als wir über Gleitkommazahlen gesprochen haben, wurde Abhilfe durch ein Modul versprochen, und dieses Modul heißt decimal. Es muss aber noch einmal deutlich darauf hingewiesen werden, dass diese Abhilfe auf Kosten der Performance geht.

Das Modul decimal enthält im Wesentlichen den Datentyp Decimal, der Dezimalzahlen mit einer beliebigen Präzision speichern und verarbeiten kann. In diesem Abschnitt möchten wir Sie in die Verwendung des Datentyps einführen, die sich an die Verwendung der vorhandenen numerischen Datentypen anlehnt. Um die Beispiele auszuführen, müssen Sie den Datentyp zuerst einbinden:

>>> from decimal import Decimal

Hinweis
Das hier besprochene Modul decimal folgt in seiner Funktionsweise der General Decimal Arithmetic Specification von IBM. Aus diesem Grund ist es möglich, dass Ihnen ein ähnliches Modul bereits von einer anderen Programmiersprache her bekannt ist.

Es existieren beispielsweise Bibliotheken, die das decimal-Modul in gleicher oder abgewandelter Form für C, C++, Java oder Perl implementieren.



Galileo Computing - Zum Seitenanfang

14.3.1 Verwendung des Datentyps  Zur nächsten ÜberschriftZur vorigen Überschrift

Es existiert kein Literal, mit dem Sie Instanzen des Datentyps Decimal direkt erzeugen könnten, wie es beispielsweise bei float der Fall ist. Um eine Decimal-Instanz mit einem bestimmten Wert zu erzeugen, müssen Sie den Datentyp explizit instanziieren. Der Wert kann dem Konstruktor in Form eines Strings übergeben werden.

>>> Decimal("0.9") 
Decimal("0.9") 
>>> Decimal("1.33e7") 
Decimal("1.33E+7")

Dies ist die geläufigste Art, Decimal zu instanziieren. Es ist außerdem möglich, dem Konstruktor eine ganze Zahl oder ein Tupel zu übergeben:

>>> Decimal(123) 
Decimal("123") 
>>> Decimal((0, (3, 1, 4, 1), -3)) 
Decimal("3.141")

Im zweiten Fall bestimmt das erste Element des Tupels das Vorzeichen, wobei 0 für eine positive und 1 für eine negative Zahl steht. Das zweite Element muss ein weiteres Tupel sein, das alle Ziffern der Zahl enthält. Das dritte Element des Tupels entspricht dem Exponenten der zuvor angegebenen Zahl.

Beachten Sie, dass es ausdrücklich nicht möglich ist, bei der Instanziierung eine Gleitkommazahl direkt zu übergeben, da sich sonst die Ungenauigkeiten von float auf den Datentyp Decimal übertragen würden.

Sobald eine Decimal-Instanz erzeugt wurde, kann diese wie eine Instanz eines bekannten numerischen Datentyps verwendet werden. Das bedeutet insbesondere, dass alle von diesen Datentypen her bekannten Operatoren auch für Decimal definiert sind. Es ist zudem möglich, Decimal in Operationen mit anderen numerischen Datentypen zu verwenden. Kurzum: Decimal passt sich nahezu perfekt in die bestehende Welt der numerischen Datentypen ein.

>>> Decimal("0.9") * 5 
Decimal("4.5") 
>>> Decimal("0.9") / 10 
Decimal("0.09") 
>>> Decimal("0.9") % Decimal("1.0") 
Decimal("0.9")

Eine Besonderheit des Datentyps ist es, abschließende Nullen beim Nachkommaanteil einer Dezimalzahl beizubehalten, obwohl diese eigentlich überflüssig sind. Das ist beispielsweise beim Rechnen mit Geldbeträgen von Nutzen:

>>> Decimal("2.50") + Decimal("4.20") 
Decimal("6.70")

Ein Decimal-Wert lässt sich in einen Wert eines beliebigen anderen numerischen Datentyps überführen. Beachten Sie, dass solche Konvertierungen im Falle von Decimal in der Regel verlustbehaftet sind, der Wert also an Genauigkeit verliert.

>>> float(Decimal("1.337")) 
1.337 
>>> float(Decimal("0.9")) 
0.90000000000000002 
>>> int(Decimal("1.337")) 
1

Diese Eigenschaft ermöglicht es, Decimal-Instanzen ganz selbstverständlich als Parameter von beispielsweise Built-in Functions oder Funktionen der Bibliothek math zu übergeben.

>>> import math 
>>> math.sqrt(Decimal("2")) 
1.4142135623730951

Beachten Sie dabei, dass von diesen Funktionen auch in einem solchen Fall niemals eine Decimal-Instanz zurückgegeben wird. Unter Verwendung des Moduls math laufen Sie also Gefahr, durch den float-Rückgabewert an Genauigkeit zu verlieren.

Diese Beschränkung lässt sich bei vielen mathematischen Operationen durch Verwendung der entsprechenden Operatoren umgehen, da diese das Ergebnis in jedem Fall als Decimal-Instanz zurückgeben. Als einzige mathematische Funktion ist, zusätzlich zu den Operatoren, für den Datentyp Decimal die Methode sqrt zum Ziehen der Quadratwurzel definiert:

>>> d = Decimal("9") 
>>> d.sqrt() 
Decimal("3")

Tipp
Das Programmieren mit dem Datentyp Decimal ist mit viel Schreibarbeit verbunden, da kein Literal für diesen Datentyp existiert. Viele Python-Programmierer behelfen sich damit, dem Datentyp einen kürzeren Namen zu verpassen:

>>> from decimal import Decimal as D >>> D("1.5e-7") Decimal("1.5E-7")


Galileo Computing - Zum Seitenanfang

14.3.2 Nichtnumerische Werte  Zur nächsten ÜberschriftZur vorigen Überschrift

Aus Abschnitt 8.3.2 kennen Sie bereits die Werte nan und inf des Datentyps float, die immer dann auftraten, wenn eine Berechnung nicht möglich war bzw. eine Zahl den Zahlenraum von float sprengte. Selbst konnten Sie diese Werte allerdings nicht vergeben.

Der Datentyp Decimal baut auf diesem Ansatz auf und ermöglicht es Ihnen zudem, Decimal-Instanzen mit einem solchen Zustand zu initialisieren. Folgende Werte sind möglich:


Tabelle 14.1  Nichtnumerische Werte des Datentyps Decimal
Wert Bedeutung

Infinity, Inf

Positiv unendlich

-Infinity, -Inf

Negativ unendlich

NaN

Ungültiger Wert (»Not a Number«)

sNaN

Ungültiger Wert (»signaling Not a Number«)

Der Unterschied zu NaN besteht darin, dass eine Exception geworfen wird, sobald versucht wird, mit sNaN weiterzurechnen. Rechenoperationen mit NaN funktionieren anstandslos, ergeben allerdings immer wieder NaN.


Diese nichtnumerischen Werte können wie Zahlen verwendet werden:

>>> Decimal("NaN") + Decimal("42.42") 
Decimal("NaN") 
>>> Decimal("Infinity") + Decimal("Infinity") 
Decimal("Infinity") 
>>> Decimal("sNaN") + Decimal("42.42") 
Traceback (most recent call last): 
[…] 
decimal.InvalidOperation: sNaN 
>>> Decimal("Inf") - Decimal("Inf") 
Traceback (most recent call last): 
[…] 
decimal.InvalidOperation: -INF + INF

Galileo Computing - Zum Seitenanfang

14.3.3 Das Context-Objekt  topZur vorigen Überschrift

Eingangs wurde erwähnt, dass es der Datentyp Decimal erlaubt, Dezimalzahlen mit beliebiger Genauigkeit zu speichern. Die Genauigkeit, das heißt die Anzahl der Nachkommastellen ist eine von mehreren globalen Einstellungen, die innerhalb eines sogenannten Context-Objekts gekapselt werden.

Um auf den aktuellen Kontext der arithmetischen Operationen zugreifen zu können, existieren innerhalb des Moduls decimal die Funktionen getcontext und setcontext.

An dieser Stelle möchten wir nur auf drei Attribute des Context-Objekts eingehen, die die Berechnungen beeinflussen können:

prec

Das Attribut prec (für »precision«) ermöglicht es, die Genauigkeit der Decimal-Instanzen des aktuellen Kontextes zu bestimmen. Der Wert versteht sich als Anzahl der zu berechnenden Nachkommastellen und ist eine ganze Zahl.

>>> c = decimal.getcontext() 
>>> c.prec = 3 
>>> Decimal("1.23456789") * Decimal("2.3456789") 
Decimal("2.90")
Emin, Emax

Die Attribute Emin und Emax ermöglichen es, die maximale bzw. minimale Größe des Exponenten festzulegen. Beide müssen eine ganze Zahl referenzieren. Wenn das Ergebnis einer Berechnung dieses Limit überschreitet, wird eine Exception geworfen.

>>> c = decimal.getcontext() 
>>> c.Emax = 9 
>>> Decimal("1e100") * Decimal("1e100") 
Traceback (most recent call last): 
[…] 
decimal.Overflow: above Emax

Dieses Kapitel kann allenfalls als grundlegende Einführung in das Modul decimal verstanden werden, denn dieses Modul bietet noch viele weitere Möglichkeiten, Berechnungen anzustellen oder Ergebnisse dieser Berechnungen genau an die eigenen Bedürfnisse anzupassen. Sollte also Ihr Interesse an diesem Modul geweckt worden sein, fühlen Sie sich dazu ermutigt, insbesondere in der Python-Dokumentation nach weiteren Verwendungswegen zu forschen.

Beachten Sie aber, dass üblicherweise kein Bedarf an solch präzisen Berechnungen besteht, wie sie der Datentyp Decimal ermöglicht. Der Geschwindigkeitsvorteil von float wiegt in der Regel schwerer als der Genauigkeitsgewinn von Decimal.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de