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ängenMfG 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
doubleist. 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.0auszudrü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.