PEP 242 – Numerische Typen
- Autor:
- Paul F. Dubois <paul at pfdubois.com>
- Status:
- Zurückgezogen
- Typ:
- Standards Track
- Erstellt:
- 17-Mär-2001
- Python-Version:
- 2.2
- Post-History:
- 17-Apr-2001
Zusammenfassung
Dieser Vorschlag gibt dem Benutzer eine optionale Kontrolle über die Präzision und den Wertebereich von numerischen Berechnungen, sodass eine Berechnung einmal geschrieben und überall mit mindestens der gewünschten Präzision und dem gewünschten Wertebereich ausgeführt werden kann. Er ist abwärtskompatibel mit bestehendem Code. Die Bedeutung von Dezimalzahlen wird geklärt.
Begründung
Derzeit ist es in jeder Sprache außer Fortran 90 unmöglich, ein Programm portabel zu schreiben, das Gleitkommazahlen verwendet und ungefähr das gleiche Ergebnis unabhängig von der Plattform liefert – oder die Kompilierung verweigert, wenn dies nicht möglich ist. Python hat derzeit nur einen Gleitkommatyp, der in der C-Implementierung einem C-Double entspricht.
Es existiert kein Typ, der Single- oder Quad-Floats entspricht. Es würde die Sprache komplizieren, zu versuchen, solche Typen direkt einzuführen, und ihre nachfolgende Verwendung wäre nicht portabel. Dieser Vorschlag ähnelt der Fortran 90 "kind"-Lösung, angepasst an die Python-Umgebung. Mit dieser Funktionalität kann eine gesamte Berechnung von einer Präzisionsebene auf eine andere umgeschaltet werden, indem eine einzige Zeile geändert wird. Wenn die gewünschte Präzision auf einer bestimmten Maschine nicht existiert, schlägt das Programm fehl, anstatt ein falsches Ergebnis zu liefern. Da das Codieren in diesem Stil einen frühen Aufruf der Routine beinhalten würde, die fehlschlägt, ist dies das Nächstbeste, was man tun kann, anstatt nicht zu kompilieren.
Unterstützte Integer- und Float-Typen
Komplexe Zahlen werden separat unten behandelt, da Python auch ohne sie erstellt werden kann.
Jeder Python-Compiler kann beliebig viele "Arten" von Integer- und Gleitkommazahlen definieren, mit der Maßgabe, dass er mindestens zwei Arten von Integern, die den bestehenden int und long entsprechen, und mindestens eine Art von Gleitkommazahlen, die dem aktuellen float entspricht, unterstützen muss.
Der Wertebereich und die Präzision dieser erforderlichen Arten sind, wie bisher, prozessorabhängig, mit Ausnahme der "long integer"-Art, die eine beliebige ganze Zahl aufnehmen kann.
Die integrierten Funktionen int(), long() und float() konvertieren Eingaben in diese Standardarten, wie sie es bisher tun. (Beachten Sie, dass ein Unicode-String tatsächlich eine andere "Art" von String ist und dass eine ausreichend sachkundige Person diesen PEP möglicherweise erweitern könnte, um diesen Fall abzudecken.)
Innerhalb jedes Typs (Integer, Float) unterstützt der Compiler eine linear geordnete Menge von Arten, wobei die Ordnung durch die Fähigkeit bestimmt wird, Zahlen mit erhöhtem Wertebereich und/oder erhöhter Präzision aufzunehmen.
Typ-Objekte
Zwei neue Standardfunktionen werden in einem Modul namens "kinds" definiert. Sie geben aufrufbare Objekte namens "kind objects" zurück. Jedes Integer- oder Float-Kind-Objekt f hat die Signatur result = f(x), und jedes komplexe Kind-Objekt hat die Signatur result = f(x, y=0.).
int_kind(n)- Für ein ganzzahliges Argument
n >= 1wird ein aufrufbares Objekt zurückgegeben, dessen Ergebnis eine Integer-Art ist, die eine ganze Zahl im offenen Intervall (-10**n,10**n) aufnehmen kann. Das Kind-Objekt akzeptiert Argumente, die ganze Zahlen, einschließlich Longs, sind. Wennn == 0, wird das Kind-Objekt zurückgegeben, das dem Python-Literal 0 entspricht. float_kind(nd, n)- Für
nd >= 0undn >= 1wird ein aufrufbares Objekt zurückgegeben, dessen Ergebnis eine Gleitkommaart ist, die eine Gleitkommazahl mit mindestens nd Ziffern Präzision und einem Basis-10-Exponenten im geschlossenen Intervall[-n, n]aufnehmen kann. Das Kind-Objekt akzeptiert Argumente, die ganze Zahlen oder Gleitkommazahlen sind.Wenn nd und n beide null sind, wird das Kind-Objekt zurückgegeben, das dem Python-Literal 0.0 entspricht.
Der Compiler gibt ein Kind-Objekt zurück, das der kleinsten seiner verfügbaren Arten für diesen Typ entspricht, die die gewünschten Eigenschaften besitzt. Wenn in einer gegebenen Implementierung keine Art mit den gewünschten Qualitäten existiert, wird eine OverflowError Ausnahme ausgelöst. Eine Kind-Funktion konvertiert ihr Argument in die Zielart, aber wenn das Ergebnis nicht in den Wertebereich der Zielart passt, wird eine OverflowError Ausnahme ausgelöst.
Neben ihrem aufrufbaren Verhalten haben Kind-Objekte Attribute, die die Eigenschaften der betreffenden Art angeben.
nameist der Name der Art. Die Standardarten heißen int, long, double.typecodeist ein einbuchstabiger String, der für die Verwendung mitNumericoder dem Modularraygeeignet wäre, um ein Array dieser Art zu bilden. Die Typencodes der Standardtypen sind 'i', 'O', 'd'.- Integer-Arten haben diese zusätzlichen Attribute:
MAX, gleich der maximal zulässigen ganzen Zahl dieser Art oderNonefür die long-Art.MIN, gleich der am stärksten negativen zulässigen ganzen Zahl dieser Art oderNonefür die long-Art. - Float-Arten haben diese zusätzlichen Attribute, deren Eigenschaften den entsprechenden Werten für den entsprechenden C-Typ in der Standard-Headerdatei "float.h" entsprechen.
MAX,MIN,DIG,MANT_DIG,EPSILON,MAX_EXP,MAX_10_EXP,MIN_EXP,MIN_10_EXP,RADIX,ROUNDS(==FLT_RADIX,FLT_ROUNDSin float.h). Diese Werte sind vom Typ Integer, außerMAX,MINundEPSILON, die vom Python-Gleitkommatyp sind, dem die Art entspricht.
Attribute des Moduls kinds
int_kinds ist eine Liste der verfügbaren Integer-Arten, sortiert von der niedrigsten zur höchsten Art. Per Definition ist int_kinds[-1] die long-Art.
float_kinds ist eine Liste der verfügbaren Gleitkommaarten, sortiert von der niedrigsten zur höchsten Art.
default_int_kind ist das Kind-Objekt, das dem Python-Literal 0 entspricht
default_long_kind ist das Kind-Objekt, das dem Python-Literal 0L entspricht
default_float_kind ist das Kind-Objekt, das dem Python-Literal 0.0 entspricht
Komplexe Zahlen
Wenn unterstützt, haben komplexe Zahlen reelle und imaginäre Teile, die Gleitkommazahlen derselben Art sind. Ein Python-Compiler muss einen komplexen Analogon zu jeder unterstützten Gleitkommaart unterstützen, wenn er überhaupt komplexe Zahlen unterstützt.
Wenn komplexe Zahlen unterstützt werden, sind im Modul kinds die folgenden verfügbar
complex_kind(nd, n)- Gibt ein aufrufbares Objekt zurück, dessen Ergebnis eine komplexe Art ist, die eine komplexe Zahl aufnehmen kann, deren Komponenten (.real, .imag) von der Art
float_kind(nd, n)sind. Das Kind-Objekt akzeptiert ein Argument, das von jeder Integer-, Real- oder Komplex-Art ist, oder zwei Argumente, beide Integer oder Real.
complex_kinds ist eine Liste der verfügbaren komplexen Arten, sortiert von der niedrigsten zur höchsten Art.
default_complex_kind ist das Kind-Objekt, das dem Python-Literal 0.0j entspricht. Der Name dieser Art ist doublecomplex, und ihr Typencode ist 'D'.
Komplexe Kind-Objekte haben diese zusätzlichen Attribute
floatkind ist das Kind-Objekt des entsprechenden Float-Typs.
Beispiele
Im Modul myprecision.py
import kinds
tinyint = kinds.int_kind(1)
single = kinds.float_kind(6, 90)
double = kinds.float_kind(15, 300)
csingle = kinds.complex_kind(6, 90)
Im Rest meines Codes
from myprecision import tinyint, single, double, csingle
n = tinyint(3)
x = double(1.e20)
z = 1.2
# builtin float gets you the default float kind, properties unknown
w = x * float(x)
# but in the following case we know w has kind "double".
w = x * double(z)
u = csingle(x + z * 1.0j)
u2 = csingle(x+z, 1.0)
Beachten Sie, wie der gesamte Code dann durch Ändern der Argumente in myprecision.py auf eine höhere Präzision umgestellt werden kann.
Kommentar: Beachten Sie, dass Ihnen nicht garantiert wird, dass single != double; aber Ihnen wird garantiert, dass double(1.e20) eine Zahl mit 15 Dezimalstellen Präzision und einem Wertebereich bis zu 10**300 aufnehmen kann oder dass der Aufruf von float_kind fehlschlägt.
Offene Fragen
Zu diesem Zeitpunkt wurden keine offenen Fragen gestellt.
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0242.rst
Zuletzt geändert: 2024-04-14 20:08:31 GMT