ceil() mit static_casts?
-
Hallo,
ich möchte folgendes:
int cel; int nmb = 20; int nmr_all = 3; cel = ceil(static_cast< double > nmb / nmr_all);das liefert mir ein warning bezüglich double to int konvertierung.
Ich kann aber den static_cast nicht weglassen weil sonst liefert ceil nicht aufgerundet zurück falls der Bruch rational ist.
ich könnte noch sowas machen um das warning zu umgehen:
cel = static_cast<int>(ceil(static_cast< double > nmb / nmr_all));aner das is doch umständlich...wie kann ich denn teilen ohne warning ?
-
testo schrieb:
cel = ceil(static_cast< double > nmb / nmr_all);Darf ich erst einmal fragen was dein Code machen soll? bzw. auf was soll sich das static_cast beziehen ("static_cast<typ>(argument)")?
-
Die Warnung gibt dir der Compiler aus weil er automatisch den Typ für dich Umwandelt, er ist sich abe rnicht sicher ob du das auch so willst, deswegen meldet er sich bei dir.
Da du mit double in der Klammer rechnest und damit das Ergebniss ein double ist bekommst du die Funktion
double ceil(double);Und mit deiner Zuweisung ergibt sich
int=double ceil(double);Bei einer Umwandlung von Komamzahlen in int gehen automatisch die Nachkommastellen verloren, deswegen gehtd er Fehler auch mit dem static_cast weg weil du dem Compiler damit sagst das du die Umwandlung wünschst.
Nachtrag:
Du solltest statt demcel = ceil(static_cast< double > nmb / nmr_all);lieber das schreiben
cel = ceil(static_cast< double >(nmb) / nmr_all);
-
ah sorry...
habs falsch abgetippt....der cast bezieht sich auf den zähler.int cel; int nmb = 20; int nmr_all = 3; cel = ceil(static_cast< double > (nmb) / nmr_all);ich versuche über ceil, floor und fmod operationen eine gegebene anzahl elemente auf buckets zu verteilen sozusagen. Und das möglichst maximal gleichverteilt.
Beispiel:
nmb = 20 und nmr_all = 3 -> 7,7,6
nmb = 5, nmr_all = 2 -> 3,2
nmb = 6, nmr_all = 2 -> 3,3
nmb = 7, nmr_all = 5 -> 2,2,1,1,1
-
Wenn du es unbedingt mit doubles rechnen willst, solltest du imho tatsächlich den static_cast dazupacken, damit die Warnung verschwindet (Warnungen stehen lassen ist keine Option, irgendwann ignoriert man sie sonst, auch wichtige Warnungen).
Du kannst deine Verteilung aber auch mit ints alleine machen:
Variante A
int rest = nmb; for(int i = nmr_all; i > 0; --i) { int bucketContent = nmb/i; int bucketIndex = nmr_all-i; bucket[bucketIndex] = bucketContent; rest -= bucketContent; }Am Anfang wird abgerundet (im Beispiel auf 6), so lange bis rest glatt zu teilen ist, dann kommt immer 7 raus.
Variante B
int numberOfBiggerBuckets = nmb % nmr_all; int smallerBucketContent = nmb/nmr_all; int biggerBucketContent = smallerBucketContent + 1; for (int i = 0; i < numberOfBiggerBuckets; ++i) bucket[i] = biggerBucketContent; for (int i = numberOfBiggerBuckets; i < nmr_all; ++i) bucket[i] = smallerBucketContent;Modulo gibt den Rest der Ganzzahldivision, und der muss auf genausoviele Buckets verteilt werden, die also jeweils einen mehr bekommen.
Kleine Anmerkung:
ich mags in meinen Codes vielleicht übertrieben haben mit den Namen, aber nmr_all und nmb sind echt mal beschissene Variablennamen

-
testo schrieb:
das is doch umständlich...wie kann ich denn teilen ohne warning ?
früher haben wir das so gemacht, daß wir gegebenenfalls gecastet haben. da sah dann so aus.
cel=int(ceil(double(nmb)/double(nmr_all)));aber das ist nicht modern. heute ist eher sowas üblich
cel=static_cast<int>(static_cast<int>(ceil(static_cast<double>(*static_cast<int*>(&nmb))/static_cast<double>(*static_cast<int*>(&nmr_all)))));beide versionen machen im prinzip das gleiche.
-
volkard schrieb:
cel=static_cast<int>(static_cast<int>(ceil(static_cast<double>(*static_cast<int*>(&nmb))/static_cast<double>(*static_cast<int*>(&nmr_all)))));Müssen das wirklich soviele casts sein? Reicht nicht diese Fassung aus?
cel=static_cast<int>(ceil(static_cast<double>(nmb)/nmr_all));
-
Xebov schrieb:
volkard schrieb:
cel=static_cast<int>(static_cast<int>(ceil(static_cast<double>(*static_cast<int*>(&nmb))/static_cast<double>(*static_cast<int*>(&nmr_all)))));Müssen das wirklich soviele casts sein? Reicht nicht diese Fassung aus?
cel=static_cast<int>(ceil(static_cast<double>(nmb)/nmr_all));stimmt.
abercel=static_cast<int>(ceil(static_cast<double>(nmb)/static_cast<double>(nmr_all)));muß schon sein, weil es systeme geben mag, wo der int mehr signifikante stellen hat als der long. um die warnung wegzumachen. das mit den zeigern war unnötig.