Programm/Funktion rechnet nicht korrekt



  • Hallo,
    bei folgendem Code ist es egal was für Zahlen die funktion zum rechnen bekommt, es kommt immer "5,03277400994827E-317" raus. Hab ich was übersehen? (Klar^^ aber was)

    double Entfp(double koord1,double koord2,double koord3,double koord4,double koord5,double koord6)
    {
        if(koord1 != koord4)
        {
            if(koord1 > koord4)
                return (koord1-koord4)*20000;
            else return (koord4-koord1)*20000;
        }
        else
        {
            if(koord2 != koord5)
            {
                if(koord2 > koord5)
                    return (koord2-koord5)*95+2700;
                else return (koord5-koord2)*95+2700;
            }
            else
            {
                if(koord3 != koord6)
                {
                    if(koord3 > koord6)
                        return (koord3-koord6)*5+1000;
                    else return (koord6-koord3)*5+1000;
                }
                else return 5;
            }
        }
    }
    


  • Guten Morgen,

    Bei return wird die Schleife auf jeden Fall verlassen. Es wird also maximal dieser Code

    double Entfp(double koord1,double koord2,double koord3,double koord4,double koord5,double koord6)
    {
        if(koord1 != koord4)
        {
            if(koord1 > koord4)
                return (koord1-koord4)*20000;
            else return (koord4-koord1)*20000; //spätestens hier wird die Schleife verlassen!
    

    ausgeführt.

    Wenn Du nun für koord1 und koord4 immer dieselben Werte nimmst, bekommst Du immer dasselbe Ergebnis zurück.

    Debugge die Schleife mal im Schrittbetrieb und Du wirst sehen, dass Sie nie vollständig ausgeführt wird.

    MfG

    Edit: Und was soll die Schleife denn eigentlich machen?



  • An der Funktion liegt es nicht. Vermutlich sind deine Eingangswerte das Problem. Wenn koord1 und koord4 sehr nahe beieinander liegen, sind sie jedoch nicht gleich und werden dem entsprechend bearbeitet. Das kann zu der von dir angegebenen Ausgabe führen.

    Hier findest du eine kleine Einführung zu der Problematik:
    http://de.wikipedia.org/wiki/Gleitkommazahl#Eigenschaften_einer_Gleitkommaarithmetik



  • Hjek schrieb:

    bei folgendem Code ist es egal was für Zahlen die funktion zum rechnen bekommt, es kommt immer "5,03277400994827E-317" raus.

    Das kann nicht sein. Ist dir klar, dass dieser Wert sehr, sehr nahe bei Null liegt? Mit welchen Werten rufst du die Funktion auf?

    Allgemein ist es nicht besonders sinnvoll, Fließkommawerte auf Gleichheit oder Ungleichheit zu prüfen, weil durch die eingebaute Ungenauigkeit bestimmte Werte gar nicht darstellbar sind.



  • Morris Szyslak schrieb:

    An der Funktion liegt es nicht. ...

    Stimmen meine Ausführungen nicht? Außer bei Gleichheit von koord1 und koord4 wird doch die Schleife frühzeitig verlassen?!

    Die wichtigste Frage ist doch erstmal: Was soll die Funktion eigentlich machen?!



  • Kolumbus schrieb:

    Stimmen meine Ausführungen nicht? Außer bei Gleichheit von koord1 und koord4 wird doch die Schleife frühzeitig verlassen?!

    In der Funktion ist doch gar keine Schleife. Also gibt es auch kein "frühzeitiges" Verlassen.



  • Ach ja, wie blöd von mir... ich meine natürlich "die Funktion wird frühzeitig verlassen". Ihr wisst doch was gemeint ist - wenn 1 und 4 nicht gleich sind, kommt es nicht zum Vergleich von 2 und 5 bzw 3 und 6... Schleife / Funktion ist doch egal - return beendet das Ganze!



  • Kolumbus schrieb:

    wenn 1 und 4 nicht gleich sind, kommt es nicht zum Vergleich von 2 und 5 bzw 3 und 6... Schleife / Funktion ist doch egal - return beendet das Ganze!

    Richtig. Aber das ist vermutlich auch beabsichtigt. Ich denke, das ist wie bei einer Sortierung nach mehreren Kriterien. Wenn schon das Hauptsortierungskriterium unterschiedlich ist, braucht man die anderen nicht mehr zu prüfen.



  • MFK schrieb:

    ... Wenn schon das Hauptsortierungskriterium unterschiedlich ist, braucht man die anderen nicht mehr zu prüfen. ...

    Die Funktion ist meiner Meinung nach anders gedacht. Deswegen lass uns erstmal auf die Antwort vom Verfasser Hjek warten, was er eigentlich erreichen will.

    Edit: @MFK: was vermutest Du über den Sinn der Funktion?



  • MFK hat Recht das ist beabsichtigt.
    Das ganze hat was mit dem Browsergame OGame zu tun undzwar soll die Entfernung von Planeten ausgerehcnet werden durch die Koordinaten. Es gibt zwar schon Rechner aber ich mach mir sowas gerne selbst 🙂

    Werte die ich zum testen benutze:

    koord1=1;
    koord2=1;
    koord3=1;
    koord4=2;
    koord5=1;
    koord6=1;
    

    Die Formel ist von hier:
    http://www.owiki.de/Entfernung



  • Hjek schrieb:

    Werte die ich zum testen benutze:

    koord1=1;
    koord2=1;
    koord3=1;
    koord4=2;
    koord5=1;
    koord6=1;
    

    Folgendes Programm, mit deiner Funktion, gibt 20000 aus, wie es sein sollte:

    int main()
    {
    	std::cout << Entfp( 1, 1, 1, 2, 1, 1 );
    }
    

    Wie kommst du auf deinen Wert?



  • Die Entfernungen scheinen hier alles ints zu sein, also nimm die doch, dann hast du da keine Probleme mehr.
    Du kannst übrigens deinen Code noch etwas vereinfachen.
    aus

    if(koord1 != koord4)
    {
        if(koord1 > koord4)
            return (koord1-koord4)*20000;
        else return (koord4-koord1)*20000;
    }
    

    kannst du das hier machen

    if(koord1 != koord4)
    {
       return abs(koord1-koord4)*20000;
    }
    


  • Danke 👍 👍 😃



  • Gu Mo,

    hmm... hatte eher an ein reale Punkte im 3-dimensionalen Raum gedacht... Wär n schönes Ding für ne Wette gewesen. (1:0 für MFK 😉 ) 😃

    MfG



  • Nur mal so nebenbei: macht es nicht eigentlich überhaupt keinen sinn doubles zu benutzen? da kommt doch eh nie was mit komma bei raus.
    kann man da nich gleich long nehmen?



  • Sagte ich auch schon. 🙂



  • Oh sorry hab ich überlesen ^^



  • Was sind den das für komische Koordinaten? Ich meine wieso gibst du 6 rein und in der Rechnung sind dann nur 2 davon interessant? Habe ja jetzt irgendwie nicht den genauen durchblick wie OGame da rechnet aber fände es dann doch irgendwie interessant was es damit auf sich hat.

    Ah ich hab mir das ma angeschaut. Das is einfaach so 😉



  • Na kann ja sein das einer auf 1:1:1 der andere auf 1:1:2 ist oder 1:1:1 und 1:2:1 das ist ne größere entfernung (Galaxie:Sonnensystem:Position im system 1-15)
    da brauch man ne andere Rechnung^^


Anmelden zum Antworten