Probleme mit einfacher Rechenformel



  • Hi habe mal wieder ein komisches Problemchen, für das es dóch hoffentlich hier im forum eine antwort gibt.

    wieso ist

    double test = (1/2) * 5;
    

    gleich 0,000000

    und

    double test1 = (0.5) * 5;
    

    gleich 2,500000?

    Worin ist dieses Phänomen begründet?

    Da ich 1/1024 und noch größere Nenner habe, ist es irgendwie ungeschickt die in Dezimalschreibweise zu programmieren.

    liebe Grüße

    Andrea



  • Du führst beim ersten eine Ganzzahldivision durch...und dadurch erwartet dein Compiler auch eine Ganzzahl als Ergebnis.
    Wenn du allerdings statt 1 1.0 und statt 5 5.0 eingibst wird eine Fließkommazahl (standardmäßig double...erst mit dem suffix f ->float)erwartet...
    also kurz gesagt...du musst ein ".0" dranhängen

    MfG Kuldren



  • double test = (1/2) * 5;
    

    (1/2) = 0, weil zwei Integer geteilt werden. Bedeutet, dass du nur das Ergebnis ohne Rest erhälst.

    Richtig ist:

    double test = (1.0/2.0) * 5;
    

    (0.5) = 0.5, weil 0.5 ein double ist...

    double test1 = (0.5) * 5;
    

    Edit: Zu langsam...



  • Danke!

    liebe Grüße

    Andrea



  • Es genügt übrigens, wenn nur einer der beiden Operanten ein double ist. In dem Fall erkennt der Compiler, dass das Ergebnis vermutlich keine Ganzzahl sein soll, denn sonst würden ja Stellen wegfallen. Wollte ich nur mal so anmerken...auch wenn es vermutlich besser ist, seine Absicht durch 2x .0 auszudrücken.



  • proggaholic schrieb:

    Es genügt übrigens, wenn nur einer der beiden Operanten ein double ist. In dem Fall erkennt der Compiler, dass das Ergebnis vermutlich keine Ganzzahl sein soll

    Naja, "erkennt" ist etwas missverständlich. Hier kommt das "usual arithmetic conversion" Pattern zum Zuge, welches im konkreten Fall folgendes aussagt:

    — If either operand is of type long double, the other shall be converted to long double.
    — Otherwise, if either operand is double, the other shall be converted to double.


Anmelden zum Antworten