Dezimalzahl in while schleife



  • Hallo,
    Ich habe vollgendes Problem und zwar weiss ich nicht wie ich das anstellen soll, wenn ich eine Dezimalzahl als Bedingung in einer while Schleife vergleiche, d.h. das Programm soll solange laufen, wie die Variable grösser ist als 0.1, so zum Beispiel:

    do
    {
     ...
    }while(fm>0.1);
    

    Jetzt bricht das Programm die Rechnung immer an derselben Stelle ab, obwohl die Bedingung in der while Schleife nicht erfüllt wurde, das Programm funktioniert wenn ich einen Wert habe der kleiner ist als 0,1 (die Lösung wird in der Konsole unter dem Namen Racine angezeigt) also ich denk dass das Problem an der Bedingung in der while Schleife liegt. Hier der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    int main()
    {
        printf("Exercice 2x^2+x-1 [-3;0], Precicsion 0,01\n\n");
        float a=-3,b=0,c=0.1,m,fa,fb,fm,x,y;
        fa=a+2*pow(a,2)-1;
        printf("f(a)=%f\n\n",fa);
        fb=b+2*pow(b,2)-1;
        printf("f(b)=%f\n\n",fb);
        if(fa*fb>0)
            printf("Il n y pas de solution pour cette equation\n");
        else
        {
            m=(a+b)/2;
            do
            {
                fm=m+2*pow(m,2)-1;
                printf("f(m)=%f\n",fm);
                x=fm*fa;
                if(x<0)
                {
                    printf("f(m)*f(a) < 0\n\n");
                    b=m;
                }
                y=fm*fb;
                if(y<0)
                {
                    printf("f(m)*f(b) < 0\n\n");
                    a=m;
                }
                m=(a+b)/2;
                fa=a+2*pow(a,2)-1;
                fb=b+2*pow(b,2)-1;
            }while(fm!=0&&fm>c);         //Hier ist das Problem
            printf("Racine=%f",m);
        }
    return 0;
    }
    


  • also fm ist bei mir -0.625 und damit kleiner als 0.1, du gibst da allerdings m aus und nicht fm. vielleicht ist das der fehler?



  • 1. Bring vernünftige Sätze zu Stande - "Ich habe vollgendes Problem und zwar" - das hätte man mir nicht mal mehr in der Grundschule durchgehen lassen.
    2. Ein paar Leerzeichen könnten deinem Code nicht schaden, findest du nicht?
    3. Ordne deine Gedanken:

    DanB schrieb:

    Jetzt bricht das Programm die Rechnung immer an derselben Stelle ab, obwohl die Bedingung in der while Schleife nicht erfüllt wurde

    Mit anderen Worten: die Schleife wird nicht fortgeführt, weil die Schleifenbedingung nicht erfüllt wird. Ergibt Sinn, oder?

    4. Hast du's mal mit Ausgaben versucht? Ein einfaches printf zeigt mir, dass zu dem Zeitpunkt, an dem die Schleifenbedingung geprüft wird, fm = -0.625000 und c = 0.100000 ist. Die Schleife wird aber nur dann fortgeführt, wenn fm != 0 und c < fm ist, d.h. dass deine Schleifenbedingung nicht zutrifft.

    EDIT: Scheißrechtschreibfehlerkorrektur.



  • Tut mir leid ich hab mich falsch ausgedrückt 🙄 mein Fehler, den Wert -0,625 erhalte ich auch aber die Zahl, die ich erhalten will muss im hunderstell Bereich liegen also noch eine Null hinter dem Komma. Die Zahl die ich erhalten sollte muss +- bei 0,0957 liegen und ich weiss nicht welche Bedingung ich in die while Schleife schreiben soll.



  • vernünftige variablennamen und evtl. sogar kommentare würden auch dazu beitragen, dass man versteht, was das programm eigentlich machen soll.



  • ie Zahl die ich erhalten sollte muss +- bei 0,0957 liegen und ich weiss nicht welche Bedingung ich in die while Schleife schreiben soll.

    -0.0957<= fm && fm <= 0.0957 ? Oder was genau meinst du jetzt? Dass deine Berechnung falsch ist und deine Schleifenbedingung richtig ist? Auch dann gilt: Nach jedem Schritt Ausgabe der Variablen und prüfen, wo dein Fehler liegt.



  • Also erst einmal tut mir leid das ich euch soviel Mühe gemacht habe, mein Programm und mein Problem zu verstehen. Ich habe mich schlecht ausgedrückt und die Variablennamen bzw der ganze Code waren auch unübersichtlich.

    Programmaufgabe: In der Theorie geht es darum so nah wie möglich an den Nullpunkt einer Funktion zu gelangen. In dem Programm darf ich aber nicht unter die angegebene Genauigkeit (0.01) gehen.

    Nachdem ich meine Gedanken mal geordnet habe (danke dachschaden 👍 ) habe ich den Fehler auch gefunden.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    int main()
    {
        printf("Exercice 2x^2+x-1 [-3;0], Precicsion 0,01\n\n");
        float a = -3, b = 0, Genauigkeit1 = 0.1, Genauigkeit2 = -0.1, m, funktionA, funktionB, funktionM, x, y;
    
        funktionA = a + 2*pow(a,2) - 1;
        printf("f(a)=%f\n\n",funktionA);
    
        funktionB = b + 2*pow(b,2) - 1;
        printf("f(b)=%f\n\n",funktionB);
    
        if(funktionA * funktionB > 0 )
            printf("Il n y pas de solution pour cette equation\n"); //
        else
        {
            m = (a+b)/2;
            do
            {
                funktionM = m + 2*pow(m,2) - 1;
                printf("f(m)=%f\n",funktionM);
                x = funktionM * funktionA;
                if(x < 0)
                {
                    printf("f(m)*f(a) < 0\n\n");
                    b = m;
                }
    
                y = funktionM * funktionB;
                if(y < 0)
                {
                    printf("f(m)*f(b) < 0\n\n");
                    a = m;
                }
    
                m = (a+b)/2;
                funktionA = a + 2*pow(a,2) - 1;
                funktionB = b + 2*pow(b,2) - 1;
    
            }while( funktionM != 0 && (funktionM > Genauigkeit1 || funktionM < Genauigkeit2));
            printf("Racine=%f",m);
        }
    return 0;
    }
    

    Als Antwort erhalte ich die Wurzel 0,984375, dessen Funktion unter 0.1 liegt. Somit ist die Aufgabe gelöst.
    Tut mir leid das ich eure Zeit in Anspruch genommen habe, nächstes Mal weiss ich wie ich die Sache angehen soll 😉


Anmelden zum Antworten