Heim >Backend-Entwicklung >C++ >Warum führt Gleitkomma-Arithmetik in C zu Präzisionsproblemen?

Warum führt Gleitkomma-Arithmetik in C zu Präzisionsproblemen?

DDD
DDDOriginal
2024-11-04 11:20:02939Durchsuche

Why Does Floating-Point Arithmetic in C   Lead to Precision Issues?

Gleitkomma-Präzisions-Macken in C

Gleitkomma-Arithmetik in C zeigt Verhaltensweisen, die kontraintuitiv sein können. Betrachten Sie Folgendes:

Der Ausdruck double a = 0.3; weist der Variablen a einen Wert zu, der logischerweise 0,3 darstellt. Die Ausgabe von std::cout << a << std::endl; mit 20 Dezimalstellen Genauigkeit zeigt „0,2999999999999999889.“ Diese Abweichung deutet darauf hin, dass die interne Speicherung der Gleitkommazahl von ihrem logischen Wert abweicht.

Ähnlich gilt in der Schleife, in der a wiederholt zu b addiert wird, das Ergebnis am Ende der Schleife (50 Iterationen). ist „15.000000000000014211“, was höher ist, als es sein sollte. Dieses Ergebnis zeigt, wie sich Rundungsfehler über mehrere Vorgänge ansammeln können.

Um diese Präzisionsprobleme zu umgehen, ist es wichtig, die Genauigkeit von Gleitkommawerten nicht höher einzustellen als die tatsächliche Genauigkeit des Datentyps. Dies kann mit dem folgenden Ansatz erreicht werden:

#include 
#include 

int main() {
    double a = 0.3;
    std::cout.precision(std::numeric_limits::digits10);
    std::cout << a << std::endl;

    double b = 0;
    for (char i = 1; i <= 50; i++) {
        b = b + a;
    }

    std::cout.precision(std::numeric_limits::digits10);
    std::cout << b << std::endl;
}

Durch Festlegen der Genauigkeit auf die maximal verfügbare Genauigkeit des Double-Datentyps stellt die Ausgabe die gespeicherten Werte genau dar. Wenn die Schleife jedoch für eine deutlich größere Anzahl von Iterationen ausgeführt wird (z. B. 5000 statt 50), macht sich der akkumulierte Fehler aufgrund der inhärenten Einschränkungen der Gleitkomma-Arithmetik immer noch bemerkbar.

Das obige ist der detaillierte Inhalt vonWarum führt Gleitkomma-Arithmetik in C zu Präzisionsproblemen?. 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