Hallo, das hört sich vermutlich etwas seltsam an, aber: ich benutze Dev-C++4 mit cygnus; Code: float z = (1 / 2); printf("%f", z); und er sagt mir: 0.000000 Bei anderen Zahlen ist es genauso. Das hat mich doch _etwas_ überrascht. Danke für die Hilfe, habe wahrscheinlich ein ziemlich großes Brett vorm Kopf, Volker __________________________________________________________ Mit WEB.DE FreePhone mit hoechster Qualitaet ab 0 Ct./Min. weltweit telefonieren! http://freephone.web.de/?mc=021201
Moin moin, Am Freitag, 1. Oktober 2004 00:14 schrieb volker wirth:
float z = (1 / 2); printf("%f", z);
und er sagt mir: 0.000000 Danke für die Hilfe, habe wahrscheinlich ein ziemlich großes Brett vorm Kopf,
Mach mal so: float z = 1; float r = 2; z = z/r; printf("%2.3\n",z); Ciao Andre
Hi Volker! volker wirth schrieb am 01.10.2004 00:14 :
float z = (1 / 2); printf("%f", z);
und er sagt mir: 0.000000
Bei anderen Zahlen ist es genauso. Das hat mich doch _etwas_ überrascht.
In welchen Sprachen hast du bis jetzt programmiert? Das ist in allen sprachen, die ich näher kenne, genauso.
Danke für die Hilfe, habe wahrscheinlich ein ziemlich großes Brett vorm Kopf,
Das Literal '1' bezeichnet die Integerzahl 1, '2' ist die Integer 2. Also berechnest du einen ganzzahligen Bruch, der 0 ergibt. Der Compiler castet dir freundlicherweise diese Integer-Null dann noch zu einer float-Null und gibt sie dir aus. Du wolltest wahrscheinlich dies hier machen: float z = (1f / 2f); printf("%f", z); Gruß, Michael
Hallo, Am Fri, 01 Oct 2004, volker wirth schrieb:
Hallo, das hört sich vermutlich etwas seltsam an, aber: ich benutze Dev-C++4 mit cygnus; Code:
float z = (1 / 2); printf("%f", z);
und er sagt mir: 0.000000
Bei anderen Zahlen ist es genauso. Das hat mich doch _etwas_ überrascht.
Das liegt daran, dass du zwei ints dividierst und erst _dann_ das Ergebnis (und das ist 0) in einen float gewandelt wird. Explizit: float z = (float)( (int) 1 / (int) 2 ); Du willst (explizit): float z = ( (float) 1 / (float) 2 ); oder: float z = ( 1.0f / 2.0f ); oder: float z = ( 1.0 / 2.0 ); HTH, -dnh -- "What I saw in the Xerox PARC technology was the caveman interface, you point and you grunt." -- Eben Moglen
volker wirth wrote:
Hallo, das hört sich vermutlich etwas seltsam an, aber: ich benutze Dev-C++4 mit cygnus; Code:
float z = (1 / 2); printf("%f", z);
und er sagt mir: 0.000000
wie wärs mit float z = (1.0 / 2.0); printf("%f\n", z); ansonsten macht du eine Integer Division. Und da stimmt dann dein Ergebnis.
* volker wirth
das hört sich vermutlich etwas seltsam an, aber: ich benutze Dev-C++4 mit cygnus; Code:
float z = (1 / 2); printf("%f", z);
und er sagt mir: 0.000000
es wurden dir ja schon einige Antworten gegeben. Üblich ist aber eigentlich nicht float sondern double (bei "normalen" Programmen): double z = 1.0 / 2.0; printf("z = %lf\n", z); Gruß, Bernhard -- Es kann passieren, was will: Es gibt immer einen, der es kommen sah. -- Fernandel
On Friday 01 October 2004 11:53, Bernhard Walle wrote:
es wurden dir ja schon einige Antworten gegeben. Üblich ist aber eigentlich nicht float sondern double (bei "normalen" Programmen):
Jein. Das wird IMHO meistens überschätzt - wenn man nicht gerade etliche
Iterationen hat, so daß sich Rundungsfehler ansammeln. In der Praxis reicht
"float" normalerweise dicke aus.
Generell muß man aber natürlich beachten, daß man mit Gleitkommazahlen immer
mit Rundungsfehlern zu rechnen hat - und das z.B. bei Vergleichen
berücksichtigen.
Was z.B. gerne zu Problemen führt, ist so etwas:
double x = wildeBerechnung();
if ( x == 42.0 )
{
... // wird praktisch nie passieren - Rundungsfehler
}
else
{
printf( "Huch?!\n" );
}
Das muß man dann eher so lösen:
double x = wildeBerechnung();
if ( fabs( x - 42.0 ) < 1e-5 )
{
... // zuverlässiger
}
else
{
printf( "Puh!\n" );
}
d.h. man prüft eigentlich nie mehr auf Gleichheit, sondern auf sehr geringe
Unterschiede. Ansonsten hat man Pech gehabt, wenn x gerade einen Wert wie
41.99998 oder 42.00001 hat - was durch Rundungsfehler sehr schnell passiert.
CU
--
Stefan Hundhammer
participants (8)
-
Andre Heine
-
Bernhard Walle
-
Carsten Weinberg
-
David Haller
-
Michael Wenger
-
Philipp Thomas
-
Stefan Hundhammer
-
volker wirth