[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!
Gast
#2549732
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?
Gast
#2549733
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.
Gast
#2549735
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.
Gast
#2549740
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
Gast
#2549772
> 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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
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
Gast
#2549776
> 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
Gast
#2549802
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.
Gast
#2549808
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)
Gast
#2549993
Da keine Schleife da ist, kann auch keine funktionieren.
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
Gast
#2550204
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.