Seite 1 von 2

BUG beim Rechnen mit Floats und Longs bzw. Strichrechnung!!!

Verfasst: 11.12.2004 13:27
von THEEX
Viel muß ich wohl dazu nicht mehr sagen, probierts einfach mal aus... Wenn man noch mit anderen Zahlen/Zeichen probiert, werden wohl noch mehr nette Sachen entdeckt.

Code: Alles auswählen

a = 500
b.f = 349.23456
c = a + 48 - b
Debug c
;so gehts immerhin
c = (a + 48) - b
Debug c

Verfasst: 11.12.2004 13:55
von Laurin
Offenbar liegt es an der Vermischung von Long- und Floatvariablen.

Code: Alles auswählen

a.f = 500
b.f = 349.23456

c.f = a + 48 - b
Debug c

c.f = (a + 48) - b
Debug c
Das geht nämlich.

Code: Alles auswählen

a.l = 500
b.l = 349.23456

c.l = a + 48 - b
Debug c

c.l = (a + 48) - b
Debug c
Das geht auch.

Der Fehler liegt wohl am Compiler, der offenbar nicht richtig erkennt, dass a ne Long ist und b ne Float. Der würfelt wohl dann alles durcheinander.


Greetz Laurin

Verfasst: 11.12.2004 14:34
von DarkDragon

Code: Alles auswählen

a = 500
b.f = 349.23456
c = Int(a + 48 - b)
Debug c
;so gehts immerhin
c = Int((a + 48) - b)
Debug c
Int() sollte man sich mal anschauen.

Verfasst: 11.12.2004 15:10
von Falko
Dann hätte ich' so geschrieben:

Code: Alles auswählen

a = 500 
b.f = 349.23456 
c = a + 48 - Int(b)
Debug c 
;so gehts immerhin 
c = (a + 48) - b
Debug c

Verfasst: 11.12.2004 15:14
von THEEX
@DarkDragon
Int() schneidet die Nachkommastellen ab und das soll nicht passiern... denn dadurch kommt 198 statt 199 raus. Auserdem bin ich trotz Deiner eingehenden Erklärung im ICQ der Meinung, daß man Floads und Longs so mischen können muß (vielleicht werd ich ja doch noch anders überzeugt).

Verfasst: 11.12.2004 15:49
von NicTheQuick
Wenn eine Rechnung einer Long-Variablen übergeben wird, rechnet PB soviel ich weiß alle Floats in der Rechnung in Longs um, also schneidet die Nachkommastellen ab. Wenn die Rechnung (oder der Term) einer Float-Variablen zugewiesen wird, wird alles mit Floats gerechnet.
Anders verhält sich das dann aber auch wieder in Zusammenhang mit [c]Int()[/c].

Verfasst: 11.12.2004 16:11
von Danilo
CSprengel hat geschrieben:Auserdem bin ich trotz Deiner eingehenden Erklärung im ICQ
der Meinung, daß man Floads und Longs so mischen können
muß (vielleicht werd ich ja doch noch anders überzeugt).
Lass Dich nicht beirren, CSprengel.

PB ist alles bekannt was es braucht:

Code: Alles auswählen

LONG = LONG + LONG - FLOAT
 c   =   a  +  48  -   b
PureBasic, als Compiler, entscheidet hier welche Schritte
nötig sind um das Ergebniss Long zu bekommen.
Das Ergebniss -2147483648 ist aber in jedem Falle absolut
falsch.
Egal ob PB 'b' nach Long umwandelt und dann rechnet:

Code: Alles auswählen

LONG = LONG + LONG -  LONG
 c   =  a   +  48  - ToLong(b)
oder ob PB alles nach Float umrechnet und dann rechnet:

Code: Alles auswählen

LONG = ToLong(   FLOAT     +   FLOAT      - FLOAT )
 c   = ToLong( ToFloat(a)  + ToFloat(48)  -   b   )
Durch die Regel "von links nach rechts" ist klar das die ersten
beiden Werte LONGs sind, die Subtraktion mit einem Float,
und das Ergebniss Long:

Code: Alles auswählen

Schritt 1:

  LONG   =:  LONG  +  LONG
  temp1  =:    a   +   48

Schritt 2:

  LONG   =:  LONG   -    LONG
    c    =:  temp1  -  ToLong(b)
Oder auch:

Code: Alles auswählen

Schritt 1:

  LONG   =:  LONG  +  LONG
  temp1  =:    a   +   48

Schritt 2:

  FLOAT  =:      FLOAT       -  FLOAT
  temp2  =:  ToFloat(temp1)  -    b

Schritt 3:

  LONG   =:      LONG
    c    =:  ToLong(temp2)
Und was ist der Unterschied zwischen

Code: Alles auswählen

LONG = LONG + LONG - FLOAT
 c   =   a  +  48  -   b
und

Code: Alles auswählen

LONG = ( LONG + LONG ) - FLOAT
 c   = (  a   +  48  ) -   b
??

Es gibt keinen Unterschied, da eh beides links nach rechts
gerechnet wird.

Vielleicht kann Dir das DarkDragon mal noch ein bissl näher
erklären. ;)

Passend ein Zitat aus "Modern Compiler Design", Seite 29:
1.5 Properties of a good compiler

The foremost property of a good compiler is of course that
it generates correct code. A compiler that occasionally generates
incorrect code is useless; a compiler that generates incorrect
code once a year may seem useful but is dangerous.

Verfasst: 11.12.2004 16:11
von Andre
... an Fred gemeldet.

Verfasst: 11.12.2004 16:24
von THEEX
Thx @Danilo, mir wurde schon gesagt, daß ich es einfach nicht verstehen wolle...

Verfasst: 12.12.2004 03:48
von Kaeru Gaman
also noch ein argument mehr....

ich benutz sowieso lieber fixcomma (angepasste longs)