Rundung bei Integer Divison?



  • was ist der kürzerste Informatikerwitz? Haben wir gleich. 😉

    aber ich bin nicht hier um euch zu belustigen, sondern hab ein frage

    ich zittere mal ein buch das ich gerade lese:

    Bei der Divison zweier int Variablen oder Zahlen ist zu beachten, daß das Ergebnis ebenfalls wieder ein int Wert liefert. Ob eventuelle Kommastellen gerundet oder abgeschnitten werden, ist kompilerabhängig. Hier ist also Vorischt geboten.

    ich habe schon ein paar Programme geschrieben, die nur Fehlerfrei Funktionieren können wenn der Compiler den Nachkommaanteil einfach verwirft?

    Was sagt da der Standard dazu?
    Ich glaube der Author hat da nur unsinn geschrieben oder mal schlechte Erfahrungen mit einem schlechten Compiler gemacht...



  • der autor hat unsinn geschrieben. wenn ein int rauskommen soll, dann wird abgeschnitten. das ist jedenfalls das verhalten der gaengisten CPUs bei integer divisionen.



  • Kapitel 6.5.5

    When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded.87) If the quotient a/b is representable, the expression (a/b)*b + a%b shall equal a.

    1. This is often called truncation toward zero.


  • Musst aufpassen, dass du zuviel Runden nicht irgendwann total falsche Ergebnisse kriegts.

    P.S. Außerdem der kürzeste Informatikerwitz ist "0xG"



  • @imhotep: probier mal "08"



  • oder noch kürzer einfach

    2



  • lol_hehe schrieb:

    oder noch kürzer einfach
    2

    da ist ja

    noch witziger.



  • Vertexwahn schrieb:

    Bei der Divison zweier int Variablen oder Zahlen ist zu beachten, daß das Ergebnis ebenfalls wieder ein int Wert liefert. Ob eventuelle Kommastellen gerundet oder abgeschnitten werden, ist kompilerabhängig. Hier ist also Vorischt geboten.

    Ich glaube der Author hat da nur unsinn geschrieben oder mal schlechte Erfahrungen mit einem schlechten Compiler gemacht...

    Vielleicht bezog er sich auf das alte K&R C, vielleicht war das da implementationsabhaengig.

    Frueher, in den 60ern und 70ern, waren Computer oft Einzelstuecke, und da gab es die merkwuerdigsten Sachen: Wortaddressierte Maschinen, 21-Bit-Ganzzahlen, 9-Bit-Bytes, Rechner, die nur Fliesskommazahlen haben, usw.

    Was man bei der Zuweisung von "long double", "double" oder "float" nach "int" beachten muss, ist allerdings, dass bei Fliesskommazahlen mit fester Bit-Breite (z.B. 32 oder 64 oder 80 Bit) ja nicht jede Zahl darstellbar ist. D.h. es kann vorkommen, dass eine Fliesskommazahl nicht als Ganzzahl darstellbar ist, weil der Wertebereich der Fliesskommazahl zu klein ist. Das kann z.B. bei kaufmaennischen Berechnungen ein Problem sein, wo man sich darauf verlassen muss, dass jede Zahl darstellbar ist.

    Deswegen verwendete man frueher im kaufmaennischen Bereich hauptsaechlich COBOL, weil es dort BCD Zahlen gab, bei denen keine Informationen verloren gingen.

    (EDIT: Ueberigens, die beste Methode, um Sicherzugehen, dass bei einer Zuweisung von Fliesskomma nach Ganzzahl kein Mist rauskommen kann, ist die Funktionen floor() bzw. ceil() vor dem Cast auf int aufzurufen.)


Anmelden zum Antworten