Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 754 – IEEE 754 Gleitkomma-Spezialwerte

Autor:
Gregory R. Warnes <gregory_r_warnes at groton.pfizer.com>
Status:
Abgelehnt
Typ:
Standards Track
Erstellt:
28-Mär-2003
Python-Version:
2.3
Post-History:


Inhaltsverzeichnis

Ablehnungsbescheid

Dieses PEP wurde abgelehnt. Nach vier Jahren ohne Aktivität hat es kein ausreichendes Interesse der Community generiert.

Mehrere Ideen dieses PEP wurden für Python 2.6 implementiert. float('inf') und repr(float('inf')) funktionieren nun garantiert auf jeder unterstützten Plattform mit IEEE 754 Semantik. Der eval(repr(float('inf'))) Roundtrip wird jedoch immer noch nicht unterstützt, es sei denn, Sie definieren inf und nan selbst.

>>> inf = float('inf')
>>> inf, 1E400
(inf, inf)
>>> neginf = float('-inf')
>>> neginf, -1E400
(-inf, -inf)
>>> nan = float('nan')
>>> nan, inf * 0.
(nan, nan)

Die Module math und sys haben ebenfalls zusätzliche Funktionen erhalten: sys.float_info, math.isinf, math.isnan, math.copysign.

Zusammenfassung

Dieses PEP schlägt eine API vor und stellt ein Referenzmodul bereit, das IEEE 754 Double-Precision Spezialwerte erzeugt und testet: positive Unendlichkeit, negative Unendlichkeit und Not-a-Number (NaN).

Begründung

Der IEEE 754-Standard definiert eine Reihe von Binärdarstellungen und algorithmischen Regeln für die Gleitkommaarithmetik. Im Standard enthalten ist eine Reihe von Konstanten zur Darstellung von Spezialwerten, einschließlich positiver Unendlichkeit, negativer Unendlichkeit und unbestimmter oder nicht-numerischer Ergebnisse (NaN). Die meisten modernen CPUs implementieren den IEEE 754-Standard, einschließlich der (Ultra)SPARC-, PowerPC- und x86-Prozessorserien.

Derzeit hängt die Handhabung von IEEE 754 Spezialwerten in Python von der zugrunde liegenden C-Bibliothek ab. Leider gibt es nur geringe Konsistenz zwischen den C-Bibliotheken, wie oder ob diese Werte behandelt werden. Zum Beispiel gibt auf einigen Systemen "float('Inf')" korrekt die IEEE 754 Konstante für positive Unendlichkeit zurück. Auf vielen Systemen erzeugt dieser Ausdruck stattdessen eine Fehlermeldung.

Die String-Ausgabedarstellung für einen IEEE 754 Spezialwert variiert ebenfalls je nach Plattform. Zum Beispiel sollte der Ausdruck "float(1e3000)", der groß genug ist, um einen Überlauf zu erzeugen, eine String-Darstellung zurückgeben, die der IEEE 754 positiven Unendlichkeit entspricht. Python 2.1.3 unter x86 Debian Linux gibt "inf" zurück. Unter Sparc Solaris 8 mit Python 2.2.1 gibt derselbe Ausdruck "Infinity" zurück, und unter MS-Windows 2000 mit Active Python 2.2.1 gibt er "1.#INF" zurück.

Zusätzlich zur Verwirrung generieren einige Plattformen beim Konvertieren von Gleitkommazahlen einen String und akzeptieren einen anderen String für die Konvertierung zu Gleitkommazahlen. Auf diesen Systemen

float(str(x))

wird einen Fehler erzeugen, wenn "x" ein IEEE Spezialwert ist.

In der Vergangenheit wurde einigen empfohlen, Ausdrücke wie

PosInf = 1e300**2
NaN = PosInf/PosInf

zu verwenden, um positive Unendlichkeit und Not-a-Number Konstanten zu erhalten. Der erste Ausdruck erzeugt jedoch auf aktuellen Python-Interpretern einen Fehler. Eine mögliche Alternative ist die Verwendung von

PosInf = 1e300000
NaN = PosInf/PosInf

Während dies mit aktuellen Python-Interpretern keinen Fehler erzeugt, ist es immer noch ein hässlicher und potenziell nicht portabler Hack. Außerdem löst die Definition von NaN auf diese Weise nicht das Problem der Erkennung solcher Werte. Erstens bietet der IEEE 754-Standard eine ganze Reihe von konstanten Werten für Not-a-Number. Zweitens verlangt der Standard, dass

NaN != X

für alle möglichen Werte von X, einschließlich NaN. Infolgedessen

NaN == NaN

sollte immer zu falsch ausgewertet werden. Dieses Verhalten wird jedoch auch nicht konsistent implementiert. [z. B. Cygwin Python 2.2.2]

Aufgrund der vielen plattform- und bibliotheksbezogenen Inkonsistenzen bei der Handhabung von IEEE-Spezialwerten ist es unmöglich, IEEE 754 Gleitkommawerte im normalen Python-Code konsistent zu setzen oder zu erkennen, ohne auf die direkte Manipulation von Bit-Mustern zurückzugreifen.

Dieses PEP schlägt eine Standard-Python-API vor und stellt eine Referenzmodulimplementierung bereit, die eine konsistente Handhabung von IEEE 754 Spezialwerten auf allen unterstützten Plattformen ermöglicht.

API-Definition

Konstanten

NaN
Nicht-signalender IEEE 754 "Not a Number" Wert
PosInf
IEEE 754 Positiver Unendlichkeitswert
NegInf
IEEE 754 Negativer Unendlichkeitswert

Funktionen

isNaN(value)
Ermitteln Sie, ob das Argument ein IEEE 754 NaN (Not a Number) Wert ist.
isPosInf(value)
Ermitteln Sie, ob das Argument ein IEEE 754 positiver Unendlichkeitswert ist.
isNegInf(value)
Ermitteln Sie, ob das Argument ein IEEE 754 negativer Unendlichkeitswert ist.
isFinite(value)
Ermitteln Sie, ob das Argument ein endlicher IEEE 754 Wert ist (d. h. kein NaN, keine positive oder negative Unendlichkeit).
isInf(value)
Ermitteln Sie, ob das Argument ein unendlicher IEEE 754 Wert ist (positive oder negative Unendlichkeit).

Beispiel

(Ausgeführt unter Python 2.2.1 auf Solaris 8.)

>>> import fpconst
>>> val = 1e30000 # should be cause overflow and result in "Inf"
>>> val
Infinity
>>> fpconst.isInf(val)
1
>>> fpconst.PosInf
Infinity
>>> nval = val/val # should result in NaN
>>> nval
NaN
>>> fpconst.isNaN(nval)
1
>>> fpconst.isNaN(val)
0

Implementierung

Die Referenzimplementierung ist im Modul "fpconst" [1] bereitgestellt, das in reinem Python geschrieben ist und das Standardmodul "struct" nutzt, um direkt die Bitmuster zu setzen oder zu testen, die IEEE 754 Spezialwerte definieren. Es wurde darauf geachtet, sowohl auf Big-Endian- als auch auf Little-Endian-Maschinen korrekte Ergebnisse zu erzeugen. Die aktuelle Implementierung ist reines Python, aber etwas Effizienz könnte durch die Übersetzung der Kernroutinen in C gewonnen werden.

Patch 1151323 "New fpconst module" [2] auf SourceForge fügt das fpconst-Modul zur Python-Standardbibliothek hinzu.

Referenzen

Weitere Referenzmaterialien zum IEEE 754 Gleitkomma-Standard finden Sie unter http://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0754.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT