Forum: Mikrocontroller und Digitale Elektronik Warum geht diese Schleife nicht?


von Markus B. (most-trinker)


Lesenswert?

[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!

von James (Gast)


Lesenswert?

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?

von James (Gast)


Lesenswert?

Und ne "Schleife" im klassischen Sinn würd ich es eh nciht nennen ;-)

Spricht abgesehen vom Problem der 0 was gegen else?

von Max W. (max96)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

bei double kann statt 0 auch 0.0000000001 rauskommen, double werte 
vergleicht man nie mit ==.

von Nitram L. (nitram)


Lesenswert?

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

von JensM (Gast)


Lesenswert?

> 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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von g457 (Gast)


Lesenswert?

> 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

von numerischMathematik (Gast)


Lesenswert?

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.

von GoP (Gast)


Lesenswert?

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.

von Der E. (rogie)


Lesenswert?

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)

von Mikel (Gast)


Lesenswert?

Da keine Schleife da ist, kann auch keine funktionieren.

von Peter D. (peda)


Lesenswert?

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

von Matze T. (gruetzwurschd)


Lesenswert?

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

von 4tg3qtga (Gast)


Lesenswert?

Man kann auch ganz einfach seinen Wertebereich anpassen,
damit man mit Integer-Zahlen rechnen kann.

von Vlad T. (vlad_tepesch)


Lesenswert?

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
Noch kein Account? Hier anmelden.