Runden in C++



  • ich wuerde in dem Fall einfach

    char *t = new char[s.length()/2 +1]
    

    nutzen. s.length ist ja ein Ganzzahl Wert, die integer-division rundet grundsaetzlich ab, so dass das +1 das Ganze in aufgerundet ergibt.
    Ceil() ergibt einen float/double/long double Wert, den du durch den Einsatz bei der Arrayindizierung implizit in einen int verwandelst (oder size_t), was dir der Compiler mit einer Warnung quittieren sollte, die durch den nicht-Einsatz von floats/doubles entfaellt.



  • pumuckl schrieb:

    die integer-division rundet grundsaetzlich ab, so dass das +1 das Ganze in aufgerundet ergibt.

    Das kommt nicht hin, wenn die Division glatt aufgeht.



  • Die Funktion soll HEX Strings nach BinStrings konvertieren. Da muß ich dann aufrunden...

    Vielen Dank 🙂



  • The-Kenny schrieb:

    Man nutzt dann doch lieber std::ceil() aus <cmath> 😉

    ceil ist aber nicht Teil von std::

    Und wenn ich cmath öffne erhalte ich beim VS6 diesen Inhalt:

    #ifndef _CMATH_
    #define _CMATH_
    #ifdef _STD_USING
     #undef _STD_USING
     #include <math.h>
     #define _STD_USING
    #else
     #include <math.h>
    #endif /* _STD_USING */
    #endif /* _CMATH_ */
    

    Unter der Haube also immer noch Win3.1 😃



  • martin_salo schrieb:

    ceil ist aber nicht Teil von std::

    Doch, in <cmath> schon. Schon seit C++ 98.

    Und wenn ich cmath öffne erhalte ich beim VS6 diesen Inhalt:

    Der VS6 kann auch noch kein C++ 98 (jedenfalls nicht gescheit).



  • => VC++ 2005 Express Edition
    aja

    double i = 0.562, l = 0.321;
    int res = static_cast<int>(i + 0.5);
    int res2 = static_cast<int>(l + 0.5);
    

    ...
    => N(a + 0.5) = Gerundet 😉



  • MFK schrieb:

    pumuckl schrieb:

    die integer-division rundet grundsaetzlich ab, so dass das +1 das Ganze in aufgerundet ergibt.

    Das kommt nicht hin, wenn die Division glatt aufgeht.

    Autsch stimmt.
    Aber folgendes muesste tun:

    char *t = new char[s.length()/2 + (s.length()%2)?1:0]
    

    Wenn die division aufgeht (modulo ergibt 0, also false) wird nichts hinzuaddiert, sonst schon 😛



  • pumuckl schrieb:

    Aber folgendes muesste tun:

    char *t = new char[s.length()/2 + (s.length()%2)?1:0]
    

    Ja, das tut wohl. Ist aber IMHO unnötig kompliziert:

    char *t = new char[(s.length()+1)/2]
    


  • Oh man ich mal wieder... Wenn ich von Hamburg nach Berlin will flieg ich auch ueber New York und Peking
    Kopf->Tisch



  • (D)Evil hats doch schon gesagt.


Anmelden zum Antworten