Schleife zum Nullstellen Raten.
-
Die Schleife soll die vom Benutzer eingegebenen Werte einter funktion dritten grades nehmen, in diese funktion zahlen (x-werte) von -1000 bis +1000 in schritten von 0,25 eingesetzt werden und den x-wert speichern wo 0 raus kommt.
das klappt bei mir immer, bis auf die funktion f(x)=-0.04x3+0.44x2-0.2x-2 da macht der probleme und sagt "Diese Funktion hat keine Nullstelle von -1000 bis 1000 bei Schritten von +0.25". warum?
hier der programmausschnitt:
Der Benutzer hat die werte für x3, x2, x und c eingegeben.
dummy=1;
null3=-1000;
while(dummy!=0)
{
dummy=x3*null3*null3*null3+x2*null3*null3+x*null3+c;
null3=null3+0.25;
if(null3>=1000)
{
cout<<"Diese Funktion hat keine Nullstelle von -1000 bis 1000 bei Schritten von +0.25.\n";
goto menu;
}
}
null3=null3-0.25;
-
Sie wird nicht genau 0.
Mach, daß Du nur die Stelle suchst, wo der Wert am dichtesten bei 0 ist.
-
Hm... bei der eingabe in den taschenrechner grade kam raus das f(10)=0 ist...
-
Hanso schrieb:
Hm... bei der eingabe in den taschenrechner grade kam raus das f(10)=0 ist...
Ja, aber der Koefizient 0.2 läßt sich nicht exakt als double darstellen. Da gibts minimale RUndungsfehler und es nicht nicht exakt 0, sonder nur 0.00000ebbes.
-
Hmpf... danke... mal sehen wie ich das lösen kann...
-
Hanso schrieb:
Hmpf... danke... mal sehen wie ich das lösen kann...
Vielleicht am einfachsten, erst mit 100 "erweitern".
f(x)=-4x3+44x2-20x-200
-
weil 44^2 auch das selbe is wie 100* 0,44^2 ? Quadrieren ist leider keine Lineare operation ^^
@Hanso: Bei double und float isses eigentlich recht üblich kein == zu verwenden. Eben durch die Rundungsfehler. Meistens prüft man auf +-0.00001 oder soetas.
Meistens machts auch kaum einen Unterschied obs nu 0.00001 oder 0 is.
-
Uii, wieviel glück der Volkard doch hat, dass seine Funktion jetzt auch zufällig bei x=10 eine Nullstelle hat
-
o_O schrieb:
weil 44^2 auch das selbe is wie 100* 0,44^2 ? Quadrieren ist leider keine Lineare operation ^^
Und gleichzeitig wird auf http://www.c-plusplus.net/forum/viewtopic-var-t-is-268639-and-highlight-is-.html doch tatsächlich gefordert, noch weniger Mathematik ins Informatikstudium zu packen.
-
Hanso schrieb:
Hmpf... danke... mal sehen wie ich das lösen kann...
while(dummy!=0)
-->
while(abs(dummy)>1.e-14)
-
-
otze schrieb:
Hanso schrieb:
Hmpf... danke... mal sehen wie ich das lösen kann...
while(dummy!=0)
-->
while(abs(dummy)>1.e-14)
Danke erst mal für eure Hilfe.
Ich hab mal das probiert was ich hier zitiert hab und dann sagt der
238 D:\Programm Kurvendiskussion\Hauptprogg.cpp call of overloaded `abs(double&)' is ambiguous
note C:\Dev-Cpp\include\stdlib.h:365 candidates are: int abs(int)
note C:\Dev-Cpp\include\stdlib.h:365 long long int __gnu_cxx::abs(long long int)
note C:\Dev-Cpp\include\stdlib.h:365 long int std::abs(long int)
-
Ach ja... wenn ich das abs und die dazu gehörigen klammern einfach weg mache kommt 11 raus obwohl 10 richtig wäre...
-
Statt
abs
kannst du mal versuchen, obfabs
klappt. Wobei ich aber meine, das auch eine Überladung fürdouble
existieren sollte...