Quadratische gleichung rundungsfehler
-
Also das programm funktioniert soweit aber bei einem teil habe ich noch probleme
Ich hab nur den teil kopiert der nicht so ganz klappt
wir haben die Ausgangsformel ax^2+bx+c=0
1.nun kann man für a,b,c einen Wert eingeben (hab das ganze programm nicht gepostet weil es sonst klappt)
2. nun soll man am schluss kontrollieren können ob man X1 und X2 richtig ausgerechnet hat
3. Satz des Vietas hiermit bestimme ich p und q mit den x1 und x2 Werten
4.mit a,b,c bestimme ich pq durhc die formel p=b/a und q=c/a
5.am Programm ende soll er nun kontrollieren ob die werte gleich sind oder ungleich
6. hier rechne ich die pq werte von vieta minus die pq werte,b,c
7.nun zu meinem problem wenn ich mit nicht kommazahlen rechnet funktioniert es bei kommazahlen gibt er mir immer falsches ergebnis aus obwohl es stimmt
Beispiel 1:
ich gebe für a=2 b=8 c=6 ein das ergibt x1=-1 x2=-3
so das programm läuft ab und sagt auch das es richtig istBeispiel 2:
ich gebe für a=5 b=8 c=1 so nun sind x1=-0.1366750 x2=-1,463325
er sagt mir nur die lösung ist falsch zeigt aber die gleichen pq werte für vieta und a,b,c an--wir dürfen nur mit den Mitteln arbeiten ,die ich angegeben habe.Also es gibt bestimmt 100 andere Wege das zu lösen aber es sollte schon mit dem c sein was ich dort benutzt habe :D.
-kann man hier vielleicht mit aufrunden arbeiten?
-oder kann man reinschreiben das er ne tolleranz von +/- 0.1 hat beim vergleichen der pq abc und pq vieta/*Text Ausgabe // Wert eingeben,speichern // Tastaturspeicher löschen */ printf("\n\nGeben sie ihren Wert x1 ein :"); scanf("%f",&x1); fflush(stdin); /*Text Ausgabe // Wert eingeben,speichern // Tastaturspeicher löschen */ printf("\nGeben sie ihren Wert x2 ein :"); scanf("%f",&x2); fflush(stdin); /*berechnen p und q mit Vieta */ pvieta=-(x1+x2); qvieta=x1*x2; /* berechnen q und p von abc */ p=b/a; q=c/a; if ((pvieta+qvieta)-(q+p)==0) /* überprüfen ob die Loesung richtig ist */ { 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!!:"); } else /* in diesen schritt gehen wenn die lüsung falsch ist */ { 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!!:"); }
Danke und greetz Phil
-
bei kommazahlen gibt er mir immer falsches ergebnis aus obwohl es stimmt
Tja, so ist das bei Fliesskommazahlen und dem Gleichheitstest. Ein Toleranzbereich ist wohl sinnvoll.
... kann man ... oder kann
Man kann vieles, vor allem einfach ausprobieren.
-
Philippr1g schrieb:
-oder kann man reinschreiben das er ne tolleranz von +/- 0.1 hat beim vergleichen der pq abc und pq vieta
Das dürfte die Lösung sein. Fließkommaberechnungen mit dem Rechner sind aufgrund der internen Darstellung immer ungenau. Bei Vergleichen musst du daher immer eine gewisse Toleranz festlegen. Vergleiche also nicht, ob das Ergebnis gleich 0 ist, sondern ob die Differenz z.B. kleiner 0.01 (oder was auch immer dir passend erscheint) ist.
-
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; }