Subtraktion ergibt negativen float-Wert
-
Hi,
folgender Code:
UCHAR pfSymbolStats[255]; INT i; FLOAT j; ... j = 0; for (i = 255; i >= 0; i--) { if (pfSymbolStats[i] != 0) { pfSymbolStats[i] = 1-pfSymbolStats[i]/(FLOAT)iLength-j; j = 1-pfSymbolStats[i]; printf("anteil %f\n", pfSymbolStats[i]); } }
ergibt im letzten printf (insgesamt sind neuen Elemente in pfSymbolStats), -0.000000. Woher diese Ausgabe, was bedeutet das, bedeutet es ueberhaupt etwas (wirkt sich das auf kuenftiges Rechnen aus: Null ist weder positiv noch negativ [also duerfte es sich eigentlich nicht auswirken])? Koennt ihr mir da weiterhelfen?
Gruss,
Caspar
-
int Werte haben immer genau die Zahl 1 zwischen den unterschiedlichen Werten. Also 10,11,12,...
float Werte haben auch eine bestimmte Zahl zwischen den einzelnen Werten, nur ist diese halt ziemlich klein.
Nun kann es vorkommen, dass die Zahl 0 nie erreicht werden kann. Die Abweichung ist aber minimal.
Wenn nun nicht alle 0er ausgegeben werden, sondern nur die vorderen, so kann durchaus das Ergebnis -0.00000 rauskommen. Das heißt, dass die Zahl z.B. -0,000000000000000000001 ist. Aber weil du nur die vorderen Stellen ausgibst, kommt eben -0,0000000 raus.mfg
harri
-
Danke, das wusste ich nicht!
Das Ergebnis ist trotzdem unverstaendlich fuer mich, da es nicht sein duerfte, da 0 als letztes Ergebnis nach der Rechnung im Programm nicht unterschrittten werden kann.Folgende Werte gibt es in pfSymbolStats - nicht angegebene Indizes sind gleich Null:
index | Wert/Haeufigkeit
------+-------------------
84 | 1
83 | 1
76 | 2
73 | 1
71 | 1
69 | 1
66 | 1
65 | 1
32 | 1Aendere ich den Code in
... if (pfSymbolStats[i] != 0) { pfSymbolStats[i] = 1-pfSymbolStats[i]/(FLOAT)iLength-j; printf("Element %d:\n", i); printf("\tj is %g\n", j); j = (1-pfSymbolStats[i]); printf("\tanteil %g\n", pfSymbolStats[i]); } ...
ergibt das folgende Ausgabe:
Element 84:
j is 0
anteil 0.9
Element 83:
j is 0.1
anteil 0.8
Element 76:
j is 0.2
anteil 0.6
Element 73:
j is 0.4
anteil 0.5
Element 71:
j is 0.5
anteil 0.4
Element 69:
j is 0.6
anteil 0.3
Element 66:
j is 0.7
anteil 0.2
Element 65:
j is 0.8
anteil 0.0999999
Element 32:
j is 0.9
anteil -9.53674e-008Wie kann das sein? Wieso ergibt '1-pfSymbolStats[i]/(FLOAT)iLength-j' bei Element Index Nummer 65 0.099999? 1-1/10-0,8 ergibt doch 0,1. Kaeme hierbai 0,1 heraus, wuerde es auch keinen negativen Wert bei Element Index 32 geben.
Weiss jemand Rat?Gruss,
Caspar
-
Caspar schrieb:
1-1/10-0,8 ergibt doch 0,1.
Weder 0.1 noch 0.8 lassen sich mit float oder double genau darstellen. Der Computer benutzt die nächstliegende Zahl, die als float/double darstellbar ist.
-
ist es denn möglich, dass der wert am ende aus irgend einem
Grund nicht deklariert ist???ps.: nebenbei solltest du garnicht erst mir float anfangen, nimm
lieber gleich double, das kann die später ne menge Ärger
nehmen.
-
Wenn der Computer Gleitkommazahlen nicht richtig darstellt, gibt es denn eine Moeglichkeit sie ueberhaupt darzustellen, wie arbeiten Kalkulationsanwendungen?
Spontat faellt mir ein, einfach Integer zu verwenden, die ich als Nachkommastellen hinter ein 0,... stelle, da die Werte in meinem Programm nie grosser als eins werden koennen.
-
Also, wenn ich mir den Datentyp deines pfSymbolStatus anschaue, wundert es mich nicht, dass du da keine Kommazahl rausbekommst.
UCHAR ist ein unsigned char, d. h. keine Gleitkommazahl.
-
Mist, ich glaube ich habe mich in dem Beispielcode verschrieben, es waren bestimmt floats, sonst waere es ueberhaupt nicht moeglich gewesen, dass die ersten neun Ausgaben eine Fliesskommazahl ausgegeben wurde. (Zumindest glaube ich das, da ich den Code schon umgeschrieben habe)