"double" wird bei "cout" abgeschnitten
-
Hallo, ich versuche mittels C++ mit einem Algorithmus einen Grenzwert zu finden und so versuche ich so viele wie möglich Nachkommastellen herausfinden, nur bei der Ausgabe wird stark abgeschnitten. Hier mal der kurze Quelltext:
double total = (sqrt(3.0)/4.0); double lastTotal = total; int i = 1; while(true) { total += ( 3.0 *pow(4.0, (i-1)) //4^(i-1) *(sqrt(3.0)/4) //(Wurzel 3)/4 *pow((1.0/3.0), (2*i)) //(1/3)^(2*i) ); std::cout << (i < 10 ? " " : "") << "A" << i << " = " << total << "\n"; if(total == lastTotal) break; else { lastTotal = total; i++; } }So und das ist die Ausgabe:
A1 = 0.57735
A2 = 0.6415
A3 = 0.670011
A4 = 0.682683
A5 = 0.688315
A6 = 0.690818
A7 = 0.69193
A8 = 0.692425
A9 = 0.692645
A10 = 0.692742
A11 = 0.692786
A12 = 0.692805
A13 = 0.692813
A14 = 0.692817
A15 = 0.692819
A16 = 0.69282
A17 = 0.69282
A18 = 0.69282
[...]
A43 = 0.69282
A44 = 0.69282
A45 = 0.69282So und eigentlich müsste er doch schon bei A17 aufhören, weil ich doch die Abfrage "if(total == lastTotal) break;" habe. Also ist für mich vorerst die einzige Erklärung, dass es weiterläuft, weil die Konsolenausgabe abgeschnitten wird. Kann man das irgendwie unterbinden bzw. meinen Code modifizieren?
Danke schon einmal im voraus!
-
Hallo
es ist niemals gut zwei float-Werte auf gleichheit vergleichen zu wollen. Denn selbst Formal gleiche Werte können durch Rundungsfehler immer noc heinen Tick unterschiedlich sein. Du must also immer auf einen Mindest-bereich vergleichen :
if(fabs(total -lastTotal) < 0.00001)bis bald
akari
-
Hallo,
danke für den Tip. Allerdings weiss ich jetzt nicht wie ich die kompletten Nachkommastellen auf der Konsole wirklich ausgeben kann?
Danke!
-
Hallo,
kralleDel schrieb:
danke für den Tip. Allerdings weiss ich jetzt nicht wie ich die kompletten Nachkommastellen auf der Konsole wirklich ausgeben kann?
Danke!Für die I/O-Stream-Klassen gibt es einige Manipulatoren, mit denen du das Verhalten der Ein/Ausgabe anpassen kannst. Für dich sind die Manipulatoren setprecision(x) (Stellt die Anzahl der Stellen fest) und fixed (keine wissenschaftlicher Schreibweise) sicherlich interessant.
Bsp:
double x = 9.99, y = 9.999999999 std::cout << setprecision(10) << fixed << x + y << std::endl; // Ausgabe als Festpunktzahl mit 10 Nachkommastellen.Gruß, Caipi
-
Mit setprecision aus dem iomanip Header (bzw. der precision-Methode des cout Objektes) kannst du die Anzahl der Dezimalstellen hinter dem Komma festlegen.