Heim > Backend-Entwicklung > C++ > Warum führen schwimmende Punktvergleiche in C# manchmal unerwartete Ergebnisse?

Warum führen schwimmende Punktvergleiche in C# manchmal unerwartete Ergebnisse?

Mary-Kate Olsen
Freigeben: 2025-01-31 04:07:36
Original
490 Leute haben es durchsucht

Why Do Floating Point Comparisons in C# Sometimes Yield Unexpected Results?

c# In vielen Programmiersprachen wie C#wird die Anzahl der schwimmenden Punkte zur Darstellung der Dezimalzahl verwendet. Aufgrund der begrenzten Darstellung der schwimmenden Punktzahl im Computer haben diese Zahlen jedoch Genauigkeitsprobleme.

Betrachten Sie die folgenden Verfahren:

Dieses Programmausgabe hat falsch, was mit 0,09
<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        float f1 = 0.09f * 100f;
        float f2 = 0.09f * 99.999999f;

        Console.WriteLine(f1 > f2);
    }
}</code>
Nach dem Login kopieren
100 mehr als 0,09

99,999999 zu sein scheint. Verstehen Sie das Problem der Genauigkeit

Der Grund für diese Genauigkeit ist die Art und Weise, wie die schwimmende Punktzahl im Speicher ausgedrückt wird. Diese digitale Speicherung ist eine Kombination aus Schwanznummer (Dezimaleil), Index (Leistung der Basis) und Symbole. Die Genauigkeit der Schwanznummer ist jedoch begrenzt.

In C#hat die einzelne Floating -Punktnummer (Float) 23 Ziffern und die Doppelprezision -Gleitkomma -Nummer (doppelt) eine 52 -Bit -Schwanznummer. Wenn die Endnummer nicht genau ausgedrückt werden kann, tritt sie in die vier Häuser ein und fünf bis die am nächsten an der Darstellung von Zahlen.

im obigen Beispiel beträgt die Genauigkeit der 0,09

100 9.000000190734863, aber weil die Genauigkeit begrenzt ist, wird sie durch 32 -Bit -Float auf 9,0 dargestellt. In ähnlicher Weise sind 0,09 99,999999 vier Häuser und fünf in -Five 9,0. Infolgedessen sind diese beiden Werte relativ gleich und das Programm gibt false aus.

Um diese Genauigkeit zu verringern, führt der IEEE 754 Floating -Punkt -Operation Standard das Konzept von "Epsilon" ein, was bedeutet, dass er 1,0 hinzugefügt werden kann, ohne den minimalen Vorwärtsfloating -Punkt zu ändern. In C#beträgt dieser Wert ca. 1,4013E-45. Durch Vergleich der Differenz zwischen den beiden schwimmenden Punktzahlen mit dem Epsilon kann festgestellt werden, ob sie für ihre Gültigkeit im Genauigkeitsbereich des schwimmenden Punktes gültig sind.

Das obige ist der detaillierte Inhalt vonWarum führen schwimmende Punktvergleiche in C# manchmal unerwartete Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage