Heim  >  Artikel  >  Backend-Entwicklung  >  Warum funktioniert „float == double“ nicht immer?

Warum funktioniert „float == double“ nicht immer?

DDD
DDDOriginal
2024-11-01 04:37:28470Durchsuche

Why Doesn't `float == double` Always Work?

Vergleich von Doubles und Floats: Warum unerwartete Ergebnisse?

Gleitkommazahlen wie Doubles und Floats spielen eine entscheidende Rolle bei der numerischen Berechnung. Der Vergleich dieser Typen kann jedoch zu rätselhaften Ergebnissen führen, wie das folgende Code-Snippet zeigt:

<code class="python">float f = 1.1
double d = 1.1
if (f == d):  # returns false!</code>

Dieses unerwartete Verhalten ist auf zwei grundlegende Faktoren zurückzuführen: Präzision und Rundung.

Präzision:

Gleitkommazahlen haben eine endliche Genauigkeit, was die Anzahl der Ziffern begrenzt, die sie genau darstellen können. Zahlen mit höherer Genauigkeit erfordern mehr Speicher, was für Gleitkommavariablen nicht immer möglich ist.

Zum Beispiel kann der Bruch 1/3 im Dezimalformat (0,33333...) in einem 32-Bit-Format nicht präzise dargestellt werden schweben. Er muss angenähert und als 0,3333333333333333 gespeichert werden, was zu einem geringfügigen Präzisionsverlust führt.

Rundung:

Binär- und Dezimalzahlen weisen inhärente Unterschiede auf. Brüche, die sich leicht im Dezimalformat darstellen lassen (z. B. 1/10 als 0,1), erfordern oft komplexe Darstellungen im Binärformat (z. B. 1/10 als 0,0001100110011...).

Diese Diskrepanz führt zu Rundungsfehlern Gleitkommawerte werden gekürzt, damit sie in die Speicherbeschränkungen passen. Daher entspricht die Darstellung von 0,1 im Beispielcode möglicherweise nicht genau der im Double gespeicherten 0,1.

Schlussfolgerung:

Aufgrund von Präzisions- und Rundungsproblemen , ist der Vergleich von Doubles und Floats mit Gleichheit (==) unzuverlässig. Ein robusterer Ansatz besteht stattdessen darin, ihre absolute Differenz mit einem akzeptablen Epsilon-Wert zu vergleichen. Dadurch wird sichergestellt, dass die Differenz innerhalb einer akzeptablen Toleranz liegt.

<code class="python">if abs(f - d) < epsilon:  # epsilon is a small threshold</code>

Dieser Ansatz stellt sicher, dass der Vergleich nicht durch Präzisions- und Rundungsfehler beeinträchtigt wird, was zu genauen und konsistenten Ergebnissen führt.

Das obige ist der detaillierte Inhalt vonWarum funktioniert „float == double“ nicht immer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn