Seite 1 von 1

Fehler bei Berechnung von Float

Verfasst: 19.03.2009 15:40
von gnasen
Hi,

ich bin ebend über ein Problem gestolpert, was ich mal soweit es ging vereinfacht habe:

Code: Alles auswählen

Value.f = (1)  !1
Value.f = (2-1)!1
Wie man sieht sind die Berechnungen exakt die selben, das eine kompiliert er, das andere nicht.

Grund: Operand ! nicht erlaubt.

Dann sollte doch beides nicht möglich sein? Wobei ich denke, dass er überhaupt nur stocken sollte, wenn floats in dem bitweisen OR mit einbezogen sind. Und somit sollte beides funktionieren.

Bin verwirrt.

Verfasst: 19.03.2009 15:46
von DarkDragon
Nein, keins sollte funktionieren laut der funktionsweise von PureBasic. PureBasic wandelt zuerst alle Elemente in den Zieldatentyp um und berechnet sie dann mit dem Term.

Verfasst: 19.03.2009 15:47
von gnasen
Damit liegt der Fehler darin, dass er es bei dem einen macht, obwohl er es nicht dürfte:

Code: Alles auswählen

Value.f = (1)  !1

Verfasst: 19.03.2009 15:49
von STARGÅTE
naja meiner Meinung nach geht das erste, weil (1) eine Konstante ist, welche als LONG erkannt wird und somit ! erlaubt ist ...
Bei (2-1) werden zwei konstanten mit einem Operator verbunden und damit KÖNNTE es Float werden, und damit ist ! nicht erlaubt ...

Verfasst: 19.03.2009 15:52
von DarkDragon
STARGÅTE hat geschrieben:naja meiner Meinung nach geht das erste, weil (1) eine Konstante ist, welche als LONG erkannt wird und somit ! erlaubt ist ...
Bei (2-1) werden zwei konstanten mit einem Operator verbunden und damit KÖNNTE es Float werden, und damit ist ! nicht erlaubt ...
Jo das wirds wohl sein. Nur wäre es optimierter wenn der Compiler 2-1 gleich ausrechnen würde und es als Konstante ansehen würde.

Verfasst: 19.03.2009 15:55
von gnasen
STARGÅTE hat geschrieben:Bei (2-1) werden zwei konstanten mit einem Operator verbunden und damit KÖNNTE es Float werden, und damit ist ! nicht erlaubt ...
Ich dachte PB wandelt nur den Typen, sobald verschiedene Typen vermischt werden. Also kann bei einer Rechenoperation zwischen 2 Longs nur eine Long rauskommen. Und diese kann ohne Probleme weiter verrechnet werden.

Verfasst: 19.03.2009 15:59
von STARGÅTE
wenn nur LONG rauskommen würde, dann würde das hier nicht gehen:
ValueF.f = 1000/3
denn dann würde 1000/3 weil es zwei LONGs sind 333 ergeben und dann als Float 333.000
aber PB macht scheinbar immer den Weg alles sicherheitshalber zu Floats zu machen, sobald eine Operation ausgeführt wird ...

Verfasst: 19.03.2009 17:39
von Kaeru Gaman
PB castet von links nach rechts.
je nach anwendung kann das etwas unpraktisch sein.

Code: Alles auswählen

Grad.l = 512
Weg = Sin( ( Grad % 360 ) * #PI / 180 )