Wie man Gleitkommavergleiche in Python handhabt

PythonPythonBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Gleitkommazahlen werden in Python häufig für numerische Berechnungen verwendet, aber ihre Darstellung kann manchmal zu unerwartetem Verhalten führen, wenn Werte verglichen werden. In diesem Tutorial werden Sie durch die Grundlagen der Gleitkommadarstellung in Python geführt und es werden praktische Techniken vorgestellt, um präzise Gleitkommavergleiche durchzuführen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python/BasicConceptsGroup -.-> python/numeric_types("Numeric Types") python/BasicConceptsGroup -.-> python/type_conversion("Type Conversion") python/PythonStandardLibraryGroup -.-> python/math_random("Math and Random") python/PythonStandardLibraryGroup -.-> python/data_collections("Data Collections") subgraph Lab Skills python/numeric_types -.-> lab-395072{{"Wie man Gleitkommavergleiche in Python handhabt"}} python/type_conversion -.-> lab-395072{{"Wie man Gleitkommavergleiche in Python handhabt"}} python/math_random -.-> lab-395072{{"Wie man Gleitkommavergleiche in Python handhabt"}} python/data_collections -.-> lab-395072{{"Wie man Gleitkommavergleiche in Python handhabt"}} end

Gleitkommadarstellung in Python

In Python werden Gleitkommazahlen gemäß dem IEEE 754-Standard dargestellt, einem weit verbreiteten Standard für die Darstellung reeller Zahlen in Computern. Dieser Standard definiert das Format und das Verhalten der Gleitkommaarithmetik, einschließlich der Darstellung spezieller Werte wie positiver und negativer Unendlichkeit sowie Not-a-Number (NaN).

Darstellung von Gleitkommazahlen

Gleitkommazahlen in Python werden im 64-Bit-Format gespeichert, auch bekannt als "Doppelpräzisions"-Gleitkommaformat. Dieses Format besteht aus drei Komponenten:

  1. Vorzeichenbit: Bestimmt, ob die Zahl positiv oder negativ ist.
  2. Exponent: Repräsentiert die Potenz von 2, zu der die Signifikante erhoben wird.
  3. Signifikante: Der gebrochene Teil der Zahl.

Die Darstellung einer Gleitkommazahl in Python kann wie folgt visualisiert werden:

graph TD A[Sign Bit] --> B[Exponent] B --> C[Significand]

Der IEEE 754-Standard definiert spezifische Bitmuster für die Darstellung spezieller Werte wie positiven und negativen Null, positiver und negativer Unendlichkeit sowie NaN.

Präzision und Rundung

Die Gleitkommaarithmetik in Computern ist aufgrund der begrenzten Anzahl von Bits zur Darstellung der Zahlen nicht immer exakt. Dies kann zu Rundungsfehlern und unerwartetem Verhalten beim Vergleich von Gleitkommawerten führen. Beispielsweise zeigt der folgende Code das Problem:

import sys

x = 0.1
y = 0.2
print(x + y)  ## Output: 0.30000000000000004

Der Grund für dieses Verhalten liegt darin, dass die Binärdarstellung von 0.1 und 0.2 nicht exakt in der begrenzten Anzahl von Bits dargestellt werden kann, die zur Speicherung von Gleitkommazahlen verwendet werden.

Um dieses Problem zu lösen, werden in der nächsten Sektion verschiedene Techniken für präzise Gleitkommavergleiche diskutiert.

Vergleich von Gleitkommazahlen

Das Vergleichen von Gleitkommazahlen in Python kann aufgrund der inhärenten Ungenauigkeiten in ihrer Darstellung eine Herausforderung sein. Die folgenden Techniken können verwendet werden, um präzise Gleitkommavergleiche durchzuführen:

Vergleich der absoluten Differenz

Der einfachste Ansatz besteht darin, zu prüfen, ob die absolute Differenz zwischen zwei Gleitkommazahlen kleiner als ein kleiner Schwellenwert ist. Diese Methode ist geeignet, wenn Sie die erwartete Präzision der verglichenen Werte kennen.

import sys

x = 0.1
y = 0.2
epsilon = sys.float_info.epsilon  ## Kleinste positive Gleitkommazahl x, so dass 1.0 + x!= 1.0
if abs(x + y - 0.3) < epsilon:
    print("x + y ist gleich 0.3")
else:
    print("x + y ist nicht gleich 0.3")

Vergleich der relativen Differenz

In Fällen, in denen die Größenordnung der verglichenen Zahlen variiert, kann der Vergleich der relativen Differenz geeigneter sein. Diese Methode prüft, ob die absolute Differenz zwischen den Zahlen im Vergleich zur Größenordnung der Zahlen klein ist.

import sys

x = 1.0
y = 1.000000001
epsilon = sys.float_info.epsilon
if abs(x - y) / max(abs(x), abs(y)) < epsilon:
    print("x ist gleich y")
else:
    print("x ist nicht gleich y")

ULP (Unit in the Last Place)-Vergleich

Die ULP-Vergleichsmethode prüft, ob die Differenz zwischen zwei Gleitkommazahlen kleiner als eine bestimmte Anzahl von Einheiten in der letzten Stelle (ULPs) ist. Dieser Ansatz ist präziser als die Methoden des Vergleichs der absoluten oder relativen Differenz.

import math

x = 0.1
y = 0.100000000000001
if abs(x - y) <= 2 * math.ulp(max(x, y)):
    print("x ist gleich y")
else:
    print("x ist nicht gleich y")

Durch die Verwendung dieser Techniken können Sie effektiv Gleitkommazahlen in Python vergleichen und die inhärenten Ungenauigkeiten in ihrer Darstellung behandeln.

Techniken für präzise Gleitkommavergleiche

Wenn Sie in Python mit Gleitkommazahlen arbeiten, ist es wichtig, geeignete Techniken zu verwenden, um präzise Vergleiche sicherzustellen. Hier sind einige Techniken, die Sie anwenden können:

Vergleich der absoluten Differenz

Beim Vergleich der absoluten Differenz wird geprüft, ob die absolute Differenz zwischen zwei Gleitkommazahlen kleiner als ein kleiner Schwellenwert ist. Diese Methode ist geeignet, wenn Sie die erwartete Präzision der verglichenen Werte kennen.

import sys

x = 0.1
y = 0.2
epsilon = sys.float_info.epsilon  ## Kleinste positive Gleitkommazahl x, so dass 1.0 + x!= 1.0
if abs(x + y - 0.3) < epsilon:
    print("x + y ist gleich 0.3")
else:
    print("x + y ist nicht gleich 0.3")

Vergleich der relativen Differenz

Beim Vergleich der relativen Differenz wird geprüft, ob die absolute Differenz zwischen zwei Gleitkommazahlen im Vergleich zur Größenordnung der Zahlen klein ist. Diese Methode ist nützlich, wenn die Größenordnung der verglichenen Zahlen variiert.

import sys

x = 1.0
y = 1.000000001
epsilon = sys.float_info.epsilon
if abs(x - y) / max(abs(x), abs(y)) < epsilon:
    print("x ist gleich y")
else:
    print("x ist nicht gleich y")

ULP (Unit in the Last Place)-Vergleich

Die ULP-Vergleichsmethode prüft, ob die Differenz zwischen zwei Gleitkommazahlen kleiner als eine bestimmte Anzahl von Einheiten in der letzten Stelle (ULPs) ist. Dieser Ansatz ist präziser als die Methoden des Vergleichs der absoluten oder relativen Differenz.

import math

x = 0.1
y = 0.100000000000001
if abs(x - y) <= 2 * math.ulp(max(x, y)):
    print("x ist gleich y")
else:
    print("x ist nicht gleich y")

Durch die Verwendung dieser Techniken können Sie effektiv Gleitkommavergleiche in Python durchführen und die gewünschte Präzision in Ihren Berechnungen gewährleisten.

Zusammenfassung

In diesem Python-Tutorial haben Sie die Herausforderungen der Gleitkommadarstellung und effektive Strategien zur Durchführung präziser Gleitkommavergleiche kennengelernt. Indem Sie die zugrunde liegenden Prinzipien verstehen und die behandelten Techniken anwenden, können Sie robusteres und zuverlässigeres Python-Code schreiben, das Gleitkommaoperationen und -vergleiche genau verarbeitet.