Fehler bei Berechnung von Float

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Fehler bei Berechnung von Float

Beitrag 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.
pb 4.51
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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.
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 )
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten