Typkonvertierung - Frage
-
Hallo, ich habe eine Frage zu den Typkonvertierungen.
Ich habe eine long int Zahl habe. Z.b. 100
und dann noch eine float Zahl habe Z.b. 1.2Jetzt addiere ich die beiden Zahlen und speichere die Werte in einer float-Variable.
Der Code sieht dann so aus:
long int i = 100; float j = 1.2; float k = i + j; printf ("%.6f\n");
Warum erhalte ich, wenn ich k ausgeben lasse das Ergebnis 101.999997 ?
Erstmal egal das ich kein Typcasting gemacht habe, aber es würde mich interessieren, warum dieses Ergebnis zustande kommt.Thx und mfg
Andre
-
fliesskommazahlen koennen nur naeherungsweise dagestellt werden.
denk einfach mal daran:
wieviele rationale zahlen liegen zwischen 1 und 2
unendlich viele. wir haben aber nur begrenzten speicher.
deshalb rechnet man immer mit ein paar stellen mehr als man tatsaechlich braucht (und nicht umgekehrt)
-
kannst ja nochn round auf "k" hauen.
-
long int i = 100; float j = 1.2; float k = i + j; printf ("%.6f\n", k);
ergebnis: 101.200000
-
printf ("%.6f\n"); /* <- */
Sei froh dass Du überhaupt ein Ergebnis bekommst
-
Ups, hatte da wohl die Variable vergessen *grins*
Danke für die Antworten!
-
Nochmal zu der Frage:
Warum bekommt hellihjb das Ergebnis 101.200000 ?
Bei mir kommt tatsächlich 101.999997 raus.
Was passiert nun eigentlich genau intern beim Rechnen?
Er addiert die long zahl mit der float zahl. Wir da die floatzahl auf long gecastet? Mir ist da nicht wirklich klar, wieso dann .999997 raus kommt.
Ciao
martin
-
Nein, die long-Zahl wird nach float konvertiert. Und da der Computer Gleitkommazahlen nicht besonders exakt darstellen kann (jedenfalls nicht bei beschränkter Größe), entstehen bei der Addition Rundungsfehler.
(btw, bist du sicher, daß du dich nicht vertippt hast? 101.999997 liegt doch etwas weit abseits von 101.2)
-
Ja, ich meinte ich natürlich 101,199997
Wenn ich aber zwei Float-Zahlen addiere passieren doch solche Rundungsfehler auch nicht. Warum tritt das gerade hier auf?
Scheinbar wird doch die Long Int zahl in eine Float-Zahl umgewandelt oder?
Warum geht dann trotzdem das addieren nicht glatt?
-
Falsch - der Fehler kann auch auftreten, wenn du nur mit float-Werten rechnest. Für eine genaue Erklräung könntest du dich ja mal durch diesen Wikipedia-Artikel durchkämpfen.
-
Danke für den Link, werde das mal lesen und hoffentlich dann verstehen
Danke und ciao
Martin