Wieso ist 1/4 = 0?
-
Hallo,
heute bin ich auf eine grausame Wahrheit gestossen, die man mir ruhig eher hätte sagen können :
Double c; c = 1/4; MessageBox::Show(c.ToString());
Wie ich heute gelernt habe, ist das Ergebnis von 1/4 für C++ 0, wohingegen das Ergebnis von 1/4.0 für C++ 0.25 ergibt . Ziemlich offensichtlich scheint dies ein Datentyp-Problem zu sein. Weist der dem Ergebnis von 1/4 tatsächlich den Typ Int zu? Warum ist das so?
Gibt es eine globale Compiler-Option, welche verhindert, dass solche Grausamkeiten auftreten und er grundsätzlich Mathematik mit dem Typ Double erledigt?
Gruß
physici
-
Das dürfte daran liegen, daß Du mit zwei Integern rechnest (bei denen dann natürlich das Ergbnis 0 ist) und diese dann erst einem Double zuweist.
So müßte es gehen: c = 1/4.0;
-
Mal im Ernst, du machst C++/CLI und dir fällt erst jetzt der Unterschied zwischen Integer und Gleitkomma Arithmetik auf?
-
Ich mach CLI im Selbststudium, mir hats niemand beigebracht. Dementsprechend sind mir wohl einige Feinheiten entgangen. Zum Beispiel das Brüche in einem Datentyp berechnet werden, der durch die verwendeten Typen im Dividenten bzw. Divisor vorgegeben werden (halte ich für ziemlich schwachsinnig).
Kann man das irgendwie umgehen?
-
Schwachsinnig ist es nicht. Das ergebnis ist int und wird dann Double zugewiesen.
Du kannst aber einen der 2 Zahlen in den passenden Datentyp bringen.
double c = 0; c = 1.0/4; c = 1/4.0; c = static_cast<double>(1)/4; c = 1/static_cast<double>(4); double d = 4; c = 1/d;
Gibt es eine globale Compiler-Option, welche verhindert, dass solche Grausamkeiten auftreten und er grundsätzlich Mathematik mit dem Typ Double erledigt?
Nein, man muss schon wissen was man tut. Ein /mitdenken gibt es leider (oder zum Glück ?) nicht.
-
Wie so ein Ausdruck behandelt wird, ist schon in der Grammatik der Sprache festgelegt.
In C bestimmen die Operanden das Ergebnis der Division (und anderer Operationen).
Im Gegensatz dazu bestimmt z.B. in Pascal der Operator das Ergebnis. Da gibt es div für die Integerdivision und / für Fliesskomma.