Warum (unsigned int)(0.3*10.0) = 2 ?
-
Hallo,
warum gibt folgendes Programm
3 2 3
aus?
Ein typecast sollte doch eigentlich nur die Dezimalstellen abscheiden ?!
Vermutlich gibts irgendwo Rechenfehler. Aber warum ist die Ausgabe von dem double dann nicht 2.9999999999999999 ??ciao Knut
---
#include <iostream>
using namespace std;int main(int argc, char **argv) {
double a = 0.3;
double b = 10.0;
cout << (unsigned int)(0.3*10.0) << " " << (unsigned int)(a*b) << " " << (a*b) << endl;
return 0;
}
-
Das 2. soll 2 ausgeben? O.o
-
knut312 schrieb:
Aber warum ist die Ausgabe von dem double dann nicht 2.9999999999999999 ??
Die rundet dann wohl...
-
Thomas:~ Thomas$ cat > test.c #include <iostream> using namespace std; int main(int argc, char **argv) { double a = 0.3; double b = 10.0; cout << (unsigned int)(0.3*10.0) << " " << (unsigned int)(a*b) << " " << (a*b) << endl; return 0; } Thomas:~ Thomas$ g++ ./test.c -o testbin Thomas:~ Thomas$ ./testbin 3 3 3
-
wie kommst du auf 2 ? egal wie ich es mache ich kriege 3 raus
-
hi,
das liegt daran, dass 0.3 * 10 < 3 ist. Siehe z.B.double a = 0.3; double b = 10.0; // vvvvvvvv cout << (unsigned int)(0.3*10.0) << " " << (unsigned int)(a*b) << " " << (a*b) - 3 << endl; gibt bei mir mit gcc aus: 3 2 -1.110223024625157e-016damit (unsigned int)(0.3*10.0) gleich 3 ergibt, muss (a*b) - 3 >= 0 sein, es ist aber negativ, also ist a*b < 3, also 2.xxxxx, und das wird auf 2 abgeschnitten.
vg tesu
-
compiler abhängig.... find ich aber selber schwachsinnig vom gcc
-
Was soll daran schwachsinnig sein?
-
Stelfer schrieb:
compiler abhängig.... find ich aber selber schwachsinnig vom gcc
Stelfer, mach dich schlau bei IEEE 754 !
von Ney
-
damit meine ich:
wenn ich es eingebe erwarte ich das richtige ergebnis, beim msvs gehts ja auch und da sind diese überinkommen nicht relevant ...
-
Es ist das richtige Ergebnis. Deine Erwartung ist nur falsch.
-
[quote=".filmor"]Es ist das richtige Ergebnis. Deine Erwartung ist nur falsch.[/quote
mathematisch ist das ergebnis falsch !
man sollte immer auf etwas aufbauen ...
-
Mathematisch gibts keine endliche binäre Darstellung für 0,3. Sei froh, dass dir der Rechner dabei nicht um die Ohren fliegt.
-
.filmor schrieb:
Mathematisch gibts keine endliche binäre Darstellung für 0,3. Sei froh, dass dir der Rechner dabei nicht um die Ohren fliegt.
das ist der punkt... es gibts nicht also warum macht gcc nicht gleich wie ms und macht 0,3*10 = 0,3
-
Stelfer schrieb:
warum macht gcc nicht gleich wie ms und macht 0,3*10 = 0,3
Das trau ich nichtmal MS zu, dass 0.3*10 = 0.3

Ansonsten mein gcc gibt mir überall 3 aus.
$ gcc --version
gcc (GCC) 4.1.1 (Gentoo 4.1.1-r3)und
$ gcc --version
i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5363)
-
Entenwickler schrieb:
$ gcc --version
gcc (GCC) 4.1.1 (Gentoo 4.1.1-r3)und
$ gcc --version
i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5363)Yeah, genau damit hätte ich auch dienen können

-
Was ich hier "schwachsinnig" finde, ist mit floating-point Zahlen zu arbeiten, und genaue Ergebnisse zu erwarten.
Wenn man 0.3*10==3 haben will muss man schon mit fixed-point/BCD/... rechnen.