Schwerer Fehler oder Doof ?

Previous topic - Next topic

mull

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 ?
AMD Phenom II x4 955 Proc. 3.2 GHZ,  4GB Ram
Windows 7 64bit Ultima
NVIDIA GeForce GTX 460
Leistungsindex 5,7

Kitty Hello

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

Moru

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.

mull

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
AMD Phenom II x4 955 Proc. 3.2 GHZ,  4GB Ram
Windows 7 64bit Ultima
NVIDIA GeForce GTX 460
Leistungsindex 5,7