[snip]
double wert = 0
// eingies an Rechenzeug
if(wert<50)
{
[snip]
}
if(wert>50)
{
[snip]
}
if(wert==0)
[snip]
}
[snip]
Egal was ich mache, er läuft nie in das wert==0 rein...
Auf dem papier nachgerechnet kommt aber genau 0 raus!
MUsst du wohl die Rechnung und sonstige Infos posten wie soll man sonst was sagen. Möglicherweise ist es ein Rundungsproblem, ein Überlauf oder so?
Und ne "Schleife" im klassischen Sinn würd ich es eh nciht nennen ;-) Spricht abgesehen vom Problem der 0 was gegen else?
Wo ist da das for bzw while oder do while? Und was soll snip bedeuten? Wenn deine Berechnung nie 0 wird dann poste doch mal diesen code vllt liegt der Fehler dort.
50 ist nicht definiert, aber das nur so nebenbei. So wie dein Code ist, kannst du es unmöglich kompilieren. Lade doch mal den vollständigen Code hoch.
bei double kann statt 0 auch 0.0000000001 rauskommen, double werte vergleicht man nie mit ==.
Markus Breitmann schrieb: > [snip] > double wert = 0 > > // eingies an Rechenzeug > > if(wert<50) > { > [snip] > } > > > if(wert>50) > { > [snip] > } > > if(wert==0) > [snip] > > } > [snip] > > Egal was ich mache, er läuft nie in das wert==0 rein... > Auf dem papier nachgerechnet kommt aber genau 0 raus! Da 0 auch kleiner als 50 ist springt er auch gleich in die erste Bedingung.. nitraM
> Da 0 auch kleiner als 50 ist springt er auch gleich in die erste > Bedingung.. > > nitraM Und muss trotzdem in die 3. Bedingung springen. Das ist nicht das Problem. Peter II hat recht: > bei double kann statt 0 auch 0.0000000001 rauskommen, double werte > > vergleicht man nie mit ==. Das ist das Problem. Gruß JensM
Martin L. schrieb: > Da 0 auch kleiner als 50 ist springt er auch gleich in die erste > Bedingung.. Aber er sollte da auch wieder rauskommen... Die Lösung (was ist Null?) wurde schon genannt. Probiers mal so:
1 | double wert = 0 |
2 | |
3 | // eingies an Rechenzeug
|
4 | |
5 | if(wert<50) |
6 | {
|
7 | ....
|
8 | }
|
9 | |
10 | |
11 | if(wert>50) |
12 | {
|
13 | .....
|
14 | }
|
15 | |
16 | if((int)wert==0) |
17 | ....
|
Stefan schrieb: > 50 ist nicht definiert, aber das nur so nebenbei. Das ist auch nicht so arg schlimm, weil es (wie die Null) so gut wie nie auftreten wird. Es gibt ja 49,999999999 und 50,00000000001 >>>>> Warum geht diese Schleife nicht? http://www.if-schleife.de
> Auf dem papier nachgerechnet kommt aber genau 0 raus!
^^^^^^^^^^^^^^ ^^^^^^^
..aber eben nur auf dem Papier. Für den Rechner kommt aufgrund von
Rundungsfehlern was anderes raus. Wenn du auf '0' untersuchen willst,
dann definier Dir ein ε und vergleich auf 'liegt im Intervall [-ε, ε]'.
HTH
das sind die Momente, in denen man weiß warum man sich mit NumMath rumgeplagt hat. Float kennt (nur in Ausnahmefällen) exakte Zahlenwerte. Der Wert 0 ist zwar als BitMuster vorgesehen, aber nur wenn man ihn aus direkt zugwiesen hat. Wird er errechnet, dann wird er oft nicht erreicht, sondern nur angenähert. Wobei in der realen Welt (Meß-)Werte mit mehr als 3 signifikanten (Dezimal)-Stellen die Rechnung nur zeigen, daß der der sie aufschreibt, noch nie was von (Meß-)Fehlern gehört hat.
numerischMathematik schrieb: > das sind die Momente, in denen man weiß warum man sich mit NumMath rumgeplagt hat. Oder auch einfach das C-Buch gelesen hat.
Aufgrund der Rundungsfehler sollte man bei double nie auf Gleichheit prüfen, sondern immer einen gewissen Toleranzbereich zulassen. z.B so: if (wert >-0.001 && wert < 0.001)
Float Zahlen können auch den Wert NaN oder Infinity haben. Dann schlägt jeder Vergleich mit einer Zahl fehl. Man sollte also genau wissen, warum man unbedingt float verwenden will. Peter
Hi, also generell würde ich auch alle variablen als "unsigned" anlegen, außer du brauchst sie mit vorzeichen. Das minimiert meiner meinung nach schonmal enorm fehlerquellen. außerdem musst du berücksichtigen, dass bei einer 0 zwei sachen hintereinander aufgerufen werden.Ist das so gewollt? Gruß Tarkan
Man kann auch ganz einfach seinen Wertebereich anpassen, damit man mit Integer-Zahlen rechnen kann.
Tarkan D. schrieb: > also generell würde ich auch alle variablen als "unsigned" anlegen, > außer du brauchst sie mit vorzeichen. Das minimiert meiner meinung nach > schonmal enorm fehlerquellen. Genau das Gegenteil der Fall. verrechnet man unsiged mit irgendwelchen signeds, werden automatisch alle signeds in unsigneds umgecastet. Was dabei rauskommt, wenn man negative Zahlen hat, kann man sich leicht vorstellen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.