"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.69282

    So 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.


Anmelden zum Antworten