GLBasic forum

Main forum => Bug Reports => Topic started by: mull on 2008-Aug-17

Title: Schwerer Fehler oder Doof ?
Post by: mull on 2008-Aug-17
SETSCREEN 800, 600, 0
GLOBAL i, Menge, Level = 1
FOR i = 1 TO 20
   INC Level, 0.1
   IF Level = 2 THEN Menge = 10
   PRINT "Level = " + Level + "  Menge = " + Menge, 10, i*15
NEXT
SHOWSCREEN
MOUSEWAIT

Warum wird Menge nicht 10 ?
Title: Re: Schwerer Fehler oder Doof ?
Post by: Kitty Hello on 2008-Aug-18
Weil hier ein interner Fehler im Prozessor dafür sorgt, dass Du 0.1 nicht exakt in IEEE darstellen kannst, und somit nicht 2.0 erreicht wird:
Code (glbasic) Select

GLOBAL i, Menge, Level = 1
FOR i = 1 TO 20
   INC Level, 0.1
   IF Level = 2 THEN Menge = 10
   PRINT "Level = " + (Level-2.0) + "  Menge = " + Menge, 10, i*15
NEXT
SHOWSCREEN
MOUSEWAIT

zeigt den Fehler.

Du kannst das umgehen, indem Du schreibst:

IF ABS(Level - 2.0) <1E-7 THEN Menge=10
Title: Re: Schwerer Fehler oder Doof ?
Post by: Moru on 2008-Aug-18
There is a nice command for figuring out problems like this. Put this before your IF line:

DEBUG "Level: " + Level + "\n"

If you put the compiler in debug-mode and run the code it will print what Level contains each loop.
Title: Re: Schwerer Fehler oder Doof ?
Post by: mull on 2008-Aug-18
Ok, gut zu wissen.
Habe eine Rundefunktion und mit:

IF Round(Level,1) = 2 THEN Menge = 10

geht es.


FUNCTION Round: Zahl, Stellen
   LOCAL p
   p = POW(10, Stellen)
   RETURN INTEGER(Zahl * p + .5) / p
ENDFUNCTION