[gelöst]Addition wird nicht ausgeführt



  • Hallo,
    mein erster Beitrag hier und ich hoffe mal ich mache keine Fehler 😉
    und zwar zunächst zur Aufgabenstellung: ich soll ein Programm schreiben, dass automatisch die größte Zahl liefert, die als Null addiert wird, also für die gilt: x+1=1

    Zunächst mal der Quellcode:

    [code]
    #include <iostream>
    #include <istream>
    #include <cmath>
    float pow( float base, int exp );
    
    using namespace std;
    
    int main()
    {
    cout << "Dieses Program berechnet die groesste Zahl zur Nulladdition\n"; 
    int i;  //Schleifenzahl
    int b;  //Schleifenzahl
    float d;  // d wird die Summe der berechneten a[i]
    float a[10]; // die a[i] werden die dezimalstellen meiner gesuchten Zahl
    float f;  //f wird zur Kontrolle ob die Gesuchte Zahl schon größer als 1 ist gebraucht
     for(i=0; i < 10; i++)
     {
        for(b=9; b >= 0; b--)
        {
             a[i]= b*pow(10.0,-i);
             int c=0;
             for(c=0; c<=i; c++)
             {
             d=a[c]+d;
             }
             cout << "d ist:" << d << "\n";
             [b]f=(d+1.0);[/b]
             cout << "f ist:" << f << "\n";
             if ((f)==1.0)          
             {
             b=-1;
             }
             cout.precision(10);
             cout << "a["<<i<<"] ist :" << a[i] << "\n";
        }       
     }          
    int e=0;
    float g=0;
    for(e=0; e<10; e++)
             {
             g=a[e]+g;
             }
    
    cout.precision(10);
    cout << "Die gesuchte Zahl ist:" << g << "\n"; 
    cin.get();
    }
    

    [/code]
    Das Problem liegt in der Fettgedruckten Zeile f=(d+1.0); die nicht richtig ausgeführt wird, und zwar wird durch die Ausgabe von f und d ersichtlich das hier fälschlicherweise f = d gesetzt wird, und ich verstehe nicht weshalb.
    bzw. es ist wichtig dass hier eine Addition stattfindet da die größte Zahl der Nulladdition denke ich ja vom Rundungsfehler bei eben dieser Addition abhängt.



  • Erstmal:
    1.) [ cpp ] Tags verwenden
    2.) Dein Code wäre lesbarer wenn Du nicht nur a,b,c,d etc für die Variablen nehmen würdest..
    rya.



  • <nicht ganz ontopic>
    lustig : D

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-253290.html

    darf man fragen, wo die aufgabe gestellt wurde?
    es scheint so, als ob ihr beide nicht wirklich (gut) c++ könntet und da die aufgabe nicht ganz trivial erscheint, gibt es nur 2 möglichkeiten:
    uni/schule und nie dagewesen/zugehört
    oder
    unfähiger lehrer/dozent

    wär auch mal interessant die kursstärke zu kennen-kommt nicht all zu häufig vor, dass 2 mit der gleichen HA (fast) am gleichen tag kommen : D

    bb



  • naja also dass ist eine Programmier Aufgabe aus Numerik0 (Uni).
    das Problem ist, dass ich tatsächlich noch nicht besonders gut C++ Programieren kann und grade dabei bin es mir selbst beizubringen.
    Es gibt zwar die Möglichkeit des betreuten Programmierens, allerdings hab ich da wegen anderen Vorlesungen keine Zeit.

    Das Ziel meines Codes ist es für jede Zehnerpotenz systematisch herauszufinden ob d=d+1 noch erfüllt ist und dann dasselbe mit der nächst niedrigen auszuprobieren. Also zuerst zu schauen ist die bedingung für 0.9 erfüllt, dann 0.8 usw.. bis schliesslich zu 0.0, falls die Schleife nicht vorher abgebrochen wurde. An diesen Punkt soll das Programm eine Zehnerpotenz niedriger gehen und für den Fall von 0.0 mit 0.09 dann 0.08usw weitermachen. Da float meines Wissens eine Genauigkeit von 7 Nachkommastellen hat, habe ich i mal bis 9 laufen lassen, denn 9 nachkommastellen sollten ja genügen. Was derjenige auf den verlinkt ist, programmiert hat hab ich nicht wirklich verstanden, aber das ist hier ja auch nicht die Frage.

    Was irgendwie noch nicht richtig funktioniert ist die berechnung von "d" bzw f=d+1 und ich kann den Fehler nicht finden weshalb.

    Anm.: Wenn ich "Rundungsfehler" geschrieben habe ist das evtl falsch ausgedrückt, ich meine den Fehler der eben bei der numerischen Addition entsteht.



  • oh Mann, ich Idiot, ich hab d bei der Variablen Definition nicht auf 0 gesetzt und somit wäre das Problem gelöst.



  • ja ja sowas ist böse:
    undefiniert + 1 = undefiniert
    manchmal wird das automatisch als 0 interpretiert, aber wie man sieht
    führt das nur zu undefiniertem Verhalten und abstürzen.

    EDIT: Man klingt ja fast philosophisch, so tiefgründig und ich hab nicht mal nachgedacht 😮



  • vll guckst du ja noch mal her und siehst dann, wie einfach das gehen würde:

    #include <iomanip>
    #include <iostream>
    
    int main()
    {
    	float i; //count == 16
    	//double i; //count == 16
    	int count = 1;
    
    	for(i = 1; i+1. != 1.; i /= 10, ++count)
    	  ;
    
    	std::cout << std::fixed << std::setprecision(30) << i << std::endl <<
    		" = 1/10^" << count << std::endl;
    }
    

    bb

    tim: was ist daran denn bitte philosophisch?


Anmelden zum Antworten