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, ob fabs klappt. Wobei ich aber meine, das auch eine Überladung für double existieren sollte...


Log in to reply