Runden von Zahlen



  • Servus, ich habe aktuell ein Problem, dass bei einer Funktion etwas schief läuft, wenn doubles reingehen, die sehr 'lange' sind. Nehme ich doubles ohne einer Zahl hinter dem Komma, dann geht es. Ich will nun ausprobieren, ob es klappt, wenn ich alle Zahlen runde auf zwei Stellen hinter dem Komma - wie geht das?

    Ich habe schon geschaut, es gibt Ansätze, dass die Zahl via Casting auf int abgeschnitten wird und dann wird die Zahl hinter dem Komma angeschaut und je nachdem floor() oder ceil() genommen. Ist das noch aktuell, oder gibts bessere Ansätze, wenn möglich will ich das Casten vermeiden.

    Danke vorab.



  • Du willst also genauer rechnen, indem du weniger Nachkommastellen verwendest? Macht irgendwie keinen Sinn, oder? 😉 Rechne einfach mit den double-Werten, wie sie sind (kleine Differenzen weit hinter dem Komma sind da ganz normal) und runde sie dann bei der Ausgabe.



  • Ich habe den Verdacht, dass sich die Funktion verschluckt. Ich erhalten dann einen P-Wert zum Vergleich zweier Wahrscheinlichkeitsverteilungen. Jetzt ist es so, dass ich das Ergebnis, wie nahe die Verteilungen beieinander liegen, ja sehen kann. Der Funktionsaufruf mit den langen double-Werte liefert unpassende Ergebnisse, der mit denen ohne Kommastellen passende Werte. Nächster Versuch ist also mal mit zwei Kommastellen zu testen - dachte ich.



  • Verstehe das Problem nicht. Vielleicht zeigst du mal ein Stück Sourcecode! 🙂



  • Habe hier nun einen Thread gesehen, der einige Lösungen zum Runden anbietet:
    http://www.c-plusplus.net/forum/39342



  • Es bleibt weiterhin fragwürdig, ob Runden dein Problem löst. Daher wäre es wirklich sinnvoll, wenn du mal Code zeigen und dein Problem etwas genauer beschreiben würdest.



  • Jay1980 schrieb:

    Habe hier nun einen Thread gesehen, der einige Lösungen zum Runden anbietet:
    http://www.c-plusplus.net/forum/39342

    An dieser Stelle kann ich dann ja mal darauf hinweisen, dass da 2 Fehler im Code sind:

    double Round(double Zahl, unsigned int Stellen)
    {
        Zahl *= pow(10, Stellen);
        if (Zahl >= 0)
            Zahl = floor(Zahl + 0.5); // Hier fehlte ein Semikolon und die Zuweisung an Zahl
        else
            Zahl = ceil(Zahl - 0.5);  // Hier fehlte die Zuweisung an Zahl
        Zahl /= pow(10, Stellen);
        return Zahl;
    }
    


  • Hier geht es ja nur ums Runden im Thread, mein Problem bezieht sich ja auf das Verfahren, das nicht so will wie ich, daher habe ich mein Problem hier in einem anderen Thread näher erläutert: http://www.c-plusplus.net/forum/290258



  • Oha, ich nutze nun die obige Runden-Funktion und in meiner IDE klappt alles, wenn ich aber den Code auf den Cluster packe, dann erhalte ich einen Fehler, es scheint so zu sein, dass der Datentyp nicht eindeutig ist - wie kann ich das ändern und warum frisst meine IDE das und der Cluster-Compiler nörgelt? Hier die Fehlermeldung:

    h2rCf.cpp: In function ‘double roundDouble(double, unsigned int)’:
    h2rCf.cpp:1072: error: call of overloaded ‘pow(int, unsigned int&)’ is ambiguous
    /usr/include/bits/mathcalls.h:154: note: candidates are: double pow(double, double)
    /usr/include/c++/4.1.2/cmath:361: note: long double std::pow(long double, int)
    /usr/include/c++/4.1.2/cmath:357: note: float std::pow(float, int)
    /usr/include/c++/4.1.2/cmath:353: note: double std::pow(double, int)
    /usr/include/c++/4.1.2/cmath:349: note: long double std::pow(long double, long double)
    /usr/include/c++/4.1.2/cmath:345: note: float std::pow(float, float)
    h2rCf.cpp:1077: error: call of overloaded ‘pow(int, unsigned int&)’ is ambiguous
    /usr/include/bits/mathcalls.h:154: note: candidates are: double pow(double, double)
    /usr/include/c++/4.1.2/cmath:361: note: long double std::pow(long double, int)
    /usr/include/c++/4.1.2/cmath:357: note: float std::pow(float, int)
    /usr/include/c++/4.1.2/cmath:353: note: double std::pow(double, int)
    /usr/include/c++/4.1.2/cmath:349: note: long double std::pow(long double, long double)
    /usr/include/c++/4.1.2/cmath:345: note: float std::pow(float, float)



  • Das ist mein Code:

    double roundDouble(double number, unsigned int digits) {
        number *= pow(10, digits);
        if (number >= 0)
            number = floor(number + 0.5);
        else
            number = ceil(number - 0.5); 
        number /= pow(10, digits);
        return number;
    }
    

  • Mod

    Du hast bisher einen C Compiler benutzt und auf dem Cluster einen C++-Compiler?

    Lösung: Verwende wieder einen C-Compiler :p . Oder caste deinen int auf das was du möchtest. edit: Bei deinem Code den du gepostet hast, während ich geantwortet habe brauchst du nicht einmal casten, ändere den Typ des Literals. Michael E. macht es vor.

    (Und es ist nach wie vor sehr fraglich, ob das Runden wirklich deine Probleme löst und es schmerzt mich zu sehen, womit andere Leute Clusterrechenzeit verbraten 😞 )



  • So eil dem Compiler zu Hülf und wähl den Parametern passendre Typen:

    power(10.0, digits);
    

Log in to reply