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

Für allgemeine Fragen zur Programmierung mit PureBasic.
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

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

Beitrag 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
Zuletzt geändert von THEEX am 11.12.2004 16:20, insgesamt 1-mal geändert.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
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
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag 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).
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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].
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
Zuletzt geändert von Danilo am 11.12.2004 16:13, insgesamt 1-mal geändert.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

... an Fred gemeldet.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Thx @Danilo, mir wurde schon gesagt, daß ich es einfach nicht verstehen wolle...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also noch ein argument mehr....

ich benutz sowieso lieber fixcomma (angepasste longs)
Antworten