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!