Runden in C++
-
Hallo Forum,
wird in C++ noch immer ceil() aus math.h benutzt?
http://www.cpp-entwicklung.de/cpplinux/cpp_main/node5.html// Hier soll t genau 2 Zeichen lang sein. std::string s="A10"; char *t = new char[ceil(s.length()/2.0)];Viele Grüße
Martin
-
Man nutzt dann doch lieber std::ceil() aus <cmath>

-
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
ajadouble 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.