C++ Builder 6.0 : merkwürdiger Gleitkommaüberlauf
-
hallo,
ich möchte im borland c++ 6.0 eine while-schleife solange durchlaufen wie double d größer als yMaximum[x][y] (double-array) ist. Also so:[code] double f = 0.001; double d = 100.0; while (d>yMaximum[x][y]) { d *= 0.1; f *= 10.0; } [/code]
da gibts aber einen Gleitkommaüberlauf.
deshalb hab ichs einfach mal so probiert:[code] double f = 0.001; double d = 100.0; int z = 0; bool p = true; while (p) { p = d>yMaximum[x][y]; z++; d *= 0.1; f *= 10.0; } [/code]
wieder Gleitkommaüberlauf. und zwar genau dann wenn z = 4 ist.
komischerweise gibts hiermit keinen Überlauf:[code] double f = 0.001; double d = 100.0; int z = 0; bool p = true; while (z<100) { p = d>yMaximum[x][y]; z++; d *= 0.1; f *= 10.0; } [/code]
Versteh überhaupt nich wieso!!!!
-
Hallo
bei mir kommen bei beiden Varianten Fehler (Gleitkommaüberlauf)
(irgendwann ist auch ein Gleitpunkt am Ende)mach mal einen try/catch Block und lass dir die Werte ausgeben
MfG
Klaus
-
yMaximum[x][y] = 50.342....
Beim Fehler:
z = 4;
d = 0.01;
f = 10.0;...also bei den Werten ist ja wohl der Gleitpunkt eigentlich noch lange nicht am Ende
-
Hallo
Also ich habe dies ausprobiert :
double f = 0.001; double d = 100.0; int z = 0; bool p = true; AnsiString Buffer; while (p) { p = d>(50.342); z++; d *= 0.1; f *= 10.0; // Ausgabe von d und f }
und alles bestens, d.h. Ausgabe :
d = 10, f = 0,01
d = 1, f = 0,1
Ich würde mal sagen, dein Array-Zugriff ist fehlerhaft oder der Wert im Array ist fehlerhaftbis bald
akari
-
Hallo
double f = 0.001; double d = 100.0; int z = 0; bool p = true; AnsiString Buffer; while (p) { p = d>(50.342); z++; d *= 0.1; f *= 10.0; // Ausgabe von d und f }
Wenn du hergegangenn waerst und den Debugger angewofen haettest
koenntest du feststellen was an deinem Beispiel falsch ist
(while ist unnoetig)daher kann der Fehler bei dir auch nicht auftreten
die Zeilep = d>(50.342); }
wie niemals true
also ......
MfG
Klaus
-
Hallo
den Wert habe ich aus deinem Post als Beispiel, wenn es also bei mir läuft, was ist bei euch anders? Und ich habe auch 12; 2; 1,5;... ausprobiert, dann kommt eben eine Zeile mehr. Ändert aber nichts daran, das ein richtiger Wert unter 100 zu einem sauberen Egrbenis führt.
(Über 100 natürlich auch)bis bald
akari
-
Hallo
okay, ich hab das Problem. Wenn yMaximum[x][y] kleiner als 0 ist, kommt der Überlauf. Warum? Weil die Multiplikation mit 0,1 für Float gegen 0 geht und das Ergebnis nie kleiner als 0 sein wird!
/Edit muß natürlich 0 heißen
bis bald
akari