Quadratische gleichung rundungsfehler



  • gut das hab ich mir gedacht kann mir einer evt den befehl sagen wie ich das mit den Toleranzen mache?

    hab da gerade garkiene idee 😃



  • Betrag von (a-b) bzw. (qp1 - pq2) groesser als 0.0042?



  • Du darfst nicht mit 0 vergleichen sondern ob die Differenz kleiner als bestimmter Wert (epsilon) ist.

    (pvieta+qvieta)-(q+p)<0.00001
    

    Dabei auch daran denken das die Differenz auch negativ sein kann.

    (fabs(pvieta+qvieta)-(q+p))<0.00001
    

    Das 0.00001 kannst du noch deinen Bedürfnissen anpassen.

    Dann nimmst du noch double statt float. Da musst du noch bei scanf das "%f" in "%lf" ersetzen.



  • hab das jetzt so geamcht weil ich ja toleranz + und - haben kann

    funktioniert gut 😃

    Danke euch

    if ((pvieta+qvieta)-(q+p)>0.03)
    		{
    			    printf("nach VIETA: P=%f, q=%f \n",pvieta,qvieta);
    			    printf("nach a,b,c: P=%f, q=%f \n",p,q);
    			    printf("loesung falsch!!:");
    		}
    		else
    		{
    			if ((pvieta+qvieta)-(q+p)<-0.03)
    			{
    		        printf("nach VIETA: P=%f, q=%f \n",pvieta,qvieta);
    			    printf("nach a,b,c: P=%f, q=%f \n",p,q);
    			    printf("loesung falsch!!:");
    			}
    			else
    			{
    				printf("nach VIETA: P=%f, q=%f \n",pvieta,qvieta);
    			    printf("nach a,b,c: P=%f, q=%f \n",p,q);
    			    printf("loesung richtig!!:");
    			}
    


  • Nein! So hast du nur redundanten Code erzeugt. Stattdessen nimm lieber fabs. Die Funktion gibt dir den Betrag eines Wertes, nimmt also das Vorzeichen weg. Wenn du es also machst, wie von DirkB vorgeschlagen, hast du eine Toleranz in positiver und negativer Richtung und brauchst nicht alles doppelt und dreifach notieren.

    EDIT: Außerdem solltest du bitte an deiner Einrückung arbeiten. Du scheinst gerne ein-, aber selten auszurücken. So ist das etwas sinnbefreit. 🙂



  • Und so ein Konstrukt

    if (...) {
             ....
            }
            else
            {
                if ((pvieta+qvieta)-(q+p)<-0.03) {
                }
                else
                {
                }
            }
    

    schreibt man als if-else-if Kette:

    if (...) {
             ....
            }
            else if ((pvieta+qvieta)-(q+p)<-0.03) {
            }
            else
            {
            }
    

    In einigen anderen Programmiersprachen gibt es für das else if extra ein eigenes Kennwort.



  • _matze schrieb:

    Nein! So hast du nur redundanten Code erzeugt. Stattdessen nimm lieber fabs. Die Funktion gibt dir den Betrag eines Wertes, nimmt also das Vorzeichen weg. Wenn du es also machst, wie von DirkB vorgeschlagen, hast du eine Toleranz in positiver und negativer Richtung und brauchst nicht alles doppelt und dreifach notieren.

    Diese Frage zur Gleitkommaarithmtik und Abfrage auf Gleichheit taucht hier sehr häufig auf. Dafür müsste es doch geeignete Tutorials geben, auf die man verlinken kann. Ich schreibe das nicht, weil andere das bestimmt schon gemacht haben. Bei Gleitkommaabfragen ist ein Toleranzwert Epsilon auf den Absolutbetrag mit fabs ein Muss! 🙂



  • Jap das es sinvoller ist sehe ich ein. wir dürfen aber nur Codes benutzen die wir beigebracht bekommen habe.

    ich bin kein reiner programmierer ich studiere elektrotechnik!

    danke Phil



  • Philippr1g schrieb:

    Jap das es sinvoller ist sehe ich ein. wir dürfen aber nur Codes benutzen die wir beigebracht bekommen habe.

    Dann schau mal in die math.h rein. Keine Angst, das ist eine Textdatei.
    Die brauchst du für dein sqrt(). Da steht auch fabs() drin.



  • Philippr1g schrieb:

    Jap das es sinvoller ist sehe ich ein. wir dürfen aber nur Codes benutzen die wir beigebracht bekommen habe.

    Ach, ein kleines fabs wird sicher keinen aufregen. Es ist ja nicht so, als ob du dir eine Bibliothek gezogen hättest, die dir sämtliche Arbeit abnimmt. Und es macht deinen Code richtiger und besser.



  • _matze schrieb:

    Ach, ein kleines fabs wird sicher keinen aufregen.

    Und wenn doch, machst du dir eine eigene Funktion.
    Als Beispiel mal für int. Für double darfst du das dann probieren.

    int my_fabs(int x)
    {
      if (x < 0) return -x;
      else       return  x;
    }
    

Anmelden zum Antworten