Rundungsfehler <double>
-
hEY gUYS!
kann mir mal jemand das hier erklären?!? Warum gibt das denn bitte Rundungsfehler?? Probiert das mal bitte aus:#include<iostream> #include<iomanip> using namespace std; int main(){ double x=5.6,y=6.0; cout<<setprecision(20)<<y<<"-"<<setprecision(20)<<x<<"="<<y-x<<endl; return 0; }
Wie kann ich diese sch*** Rundungsfehler umgehen??
-
freshman schrieb:
hEY gUYS!
kann mir mal jemand das hier erklären?!? Warum gibt das denn bitte Rundungsfehler??Computer arbeiten bekanntlich mit dem Binärsystem, und dort können Brüche wie 5.6 (= 5 3/5) nicht genau (sprich: nur periodisch) dargestellt werden. double hat aber eine endliche Genauigkeit von 53 Binärstellen, d.h. die Zahl, die letztlich im Speicher liegt, weicht minimal von 5.6 ab.
Wie kann ich diese sch*** Rundungsfehler umgehen??
Indem du verstehst, wie dein Computer funktioniert.
-
okay, okay, hätte ich auch selber drauf kommen können. Aber sage mir doch auch noch wie ich am Einfachsten an das genaue Ergebnis einer solchen einfachen Berechnung wie
6-5.6 komme. bitte, bitte
-
rechnerisch exakt mache ich es, indem ich die Fließkommazahlen auf ganze Zahlen abbilde und damit rechne und nur bei der Ausgabe auf eine Fließkommazahl zurückabbilde. Aber das alles geht doch bestimmt einfacher;-((
-
nein, der computer kann das nich anders. ende.
wenn dir das nich gefällt, dann löt dir deinen eigenen 5 Herz prozessor auf basis eines andren mathematischen systems zusammen.(aber selbst dann wirst du auch nie alle zahlen endlich darstellen können)
-
Eine alternative ist, mit rationalen Zahlen zu rechnen. Wenn man für Zähler und Nenner einen Bignum-Typ verwendet, bekommt man damit auch recht hohe Genauigkeiten.