Umgang mit Fließkomma-Genauigkeit
In diesem Schritt werden wir besprechen, wie man die Fließkomma-Genauigkeit behandelt, wenn man Fließkommazahlen mit Null vergleicht. Aufgrund der Art und Weise, wie Fließkommazahlen in Computern dargestellt werden, sind sie oft kleinen Rundungsfehlern unterworfen. Dies kann zu unerwarteten Ergebnissen führen, wenn man sie direkt mit Null vergleicht.
Beispielsweise könnte eine Berechnung, die theoretisch Null ergeben sollte, tatsächlich eine sehr kleine von Null verschiedene Zahl wie 1e-16
(0,0000000000000001) produzieren. Ein direkter Vergleich dieser Zahl mit Null unter Verwendung von ==
gibt False
zurück, was möglicherweise nicht das gewünschte Ergebnis ist.
Um dies zu behandeln, verwenden wir in der Regel einen Toleranzwert (auch als Epsilon bekannt), um zu prüfen, ob eine Fließkommazahl "nahe genug" an Null liegt.
Erstellen wir ein Python-Skript, um dies zu demonstrieren.
-
Öffnen Sie den VS Code-Editor in der LabEx-Umgebung.
-
Erstellen Sie eine neue Datei mit dem Namen float_precision.py
im Verzeichnis ~/project
.
~/project/float_precision.py
-
Fügen Sie den folgenden Code in die Datei float_precision.py
ein:
## Import the math module
import math
## Define a tolerance value (epsilon)
tolerance = 1e-9 ## A small value like 0.000000001
## A floating-point number that is very close to zero due to calculation
number = 1e-10
## Direct comparison with zero (may fail)
if number == 0:
print("Direct comparison: number is zero")
else:
print("Direct comparison: number is not zero")
## Using tolerance to compare with zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparison with tolerance: number is close to zero")
else:
print("Comparison with tolerance: number is not close to zero")
## Another example with a slightly larger number
number = 1e-7
## Direct comparison with zero (will fail)
if number == 0:
print("Direct comparison: number is zero")
else:
print("Direct comparison: number is not zero")
## Using tolerance to compare with zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparison with tolerance: number is close to zero")
else:
print("Comparison with tolerance: number is not close to zero")
Dieses Skript zeigt, wie man die Funktion math.isclose()
mit einem Toleranzwert verwendet, um Fließkommazahlen mit Null zu vergleichen.
-
Speichern Sie die Datei.
-
Führen Sie das Skript mit dem Befehl python
im Terminal aus:
python float_precision.py
Sie sollten die folgende Ausgabe sehen:
Direct comparison: number is not zero
Comparison with tolerance: number is close to zero
Direct comparison: number is not zero
Comparison with tolerance: number is not close to zero
Wie Sie sehen können, scheitert der direkte Vergleich, weil die Zahl nicht genau Null ist. Wenn man jedoch einen Toleranzwert mit math.isclose()
verwendet, erkennt der Vergleich korrekt, dass die Zahl nahe an Null liegt.
Die Funktion math.isclose()
prüft, ob zwei Fließkomma-Werte innerhalb einer angegebenen Toleranz nahe beieinander liegen. Das Argument abs_tol
gibt die absolute Toleranz an. Wenn die absolute Differenz zwischen den beiden Zahlen kleiner oder gleich der Toleranz ist, gibt die Funktion True
zurück.
Durch die Verwendung eines Toleranzwerts können Sie Probleme vermeiden, die durch die Fließkomma-Genauigkeit verursacht werden, und sicherstellen, dass Ihre Vergleiche mit Null genau und zuverlässig sind.