Warum geht diese Schleife nicht?

#2549755
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
Gast #2549772
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
Moderator (Firma: Titel) Persönliche Seite #2549774
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
Gast #2549776
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
Gast #2549802
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.
#2550097
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
#2550602
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren