Probleme mit Doubles

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Probleme mit Doubles

Beitrag von captain_hesse »

Hallo zusammen
Ich arbeite z.Z an einem etwas größeren Projekt und zwar an einem Zeichenprogramm und habe folgendes Problem,
das Programm besteht zu ca. 95% aus Double Variablen und wenn ich es nun mit der 64 Bit Version von PB starte, sind alle Berechnungen die das Programm macht korrekt aber wenn ich es mit der 32 Bit Version starte bekomme ich teilweise andere bzw. falsche Ergebnisse zurück. Sollten die Doubles in beiden PB Versionen nicht exakt das selbe ergebnis liefern :-? ?
Mir ist auch aufgefallen das dieses Problem nicht von anfang an war sondern erst als das Programm größer wurde und eine größere Anzahl an Doubles erreicht wurde.
Mein Arbeitssystem steht unten in der Signatur.

Viele Grüße
Armin
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Probleme mit Doubles

Beitrag von ts-soft »

Entweder falsche strukturen oder falsche procedurerückgabetypen, die dies bewirken.
Oder Du castest irgendwo auf ein Integer statt auf einem Quad.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Re: Probleme mit Doubles

Beitrag von captain_hesse »

Hmmm die Proceduren verwenden eine globale Structure um miteinander zu kommunizieren

Code: Alles auswählen

Structure info
  type.l
  radius.d
  x1.d
  y1.d
  x2.d
  y2.d
  mitte_x.d
  mitte_y.d
  farbe.l
  k_start.d      ;winkel angabe
  k_ende.d       ;winkel angabe
EndStructure  

Global Dim element.info(#max_elemente)
aber was ist daran falsch ?
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Probleme mit Doubles

Beitrag von ts-soft »

Daran ist nichts falsch, jedenfalls hat diese Strukture keine Schuld. Aber um Dir helfen zu können, bräuchten wir schon
die Proceduren, die für das falsche Ergebnis verantwortlich sind. Welche das sind wirst Du wohl selber rausfinden können.
Alle Proceduren nacheinander in x64 und x32 aufrufen und sehen, welche Schuld hat und hier posten.

Ich hoffe mal, Du warst so klever und hast globale Variablen vermieden, ansonsten wird es schon etwas schwieriger.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Re: Probleme mit Doubles

Beitrag von captain_hesse »

ts-soft hat geschrieben:Ich hoffe mal, Du warst so klever und hast globale Variablen vermieden, ansonsten wird es schon etwas schwieriger.
Nicht ganz ein par globale sind schon drin und auch die structuren sind global. Was bewirken diese denn ?
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Probleme mit Doubles

Beitrag von STARGÅTE »

Was TS-Soft meint ist:
Du könntest irgendwo ein Ergebnis einer Double als Integer speichern, wobei die Zahl für Integer (wenn es eine Long ist) zu klein ist, dann würdest du beim wieder Umwandeln ein falsches Ergebnis bekommen, hier bei Beispiel:

Code: Alles auswählen

Double.d = 123.456e9
Debug Double
Integer = Int(Double/10) ; << Hier wurde vergessen es als Quad zu definieren
Double = Integer * 10
Debug Double ; Unter 32Bit falsch
64Bit hat geschrieben:123456000000.0
123456000000.0
32Bit hat geschrieben:123456000000.0
-5393018880.0
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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Probleme mit Doubles

Beitrag von ts-soft »

>> Nicht ganz ein par globale sind schon drin und auch die structuren sind global. Was bewirken diese denn ?

Die bewirken, das wir deren richtigen Wert nicht unbedingt beurteilen können, da diese von allen Seiten verändert sein
könnten. Kommt halt drauf an, für was Du die eingesetzt hast, ob das sich jetzt erschwerend auswirkt.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Re: Probleme mit Doubles

Beitrag von captain_hesse »

ts-soft hat geschrieben:Die bewirken, das wir deren richtigen Wert nicht unbedingt beurteilen können, da diese von allen Seiten verändert sein
könnten. Kommt halt drauf an, für was Du die eingesetzt hast, ob das sich jetzt erschwerend auswirkt.
Das kann ich ausschließen, die globalen Variablen haben so gut wie nichts mit den Fehlberechnungen zu tun es sind nur einige wenige das ist überschaubar.
Es könnte aber möglich sein wie STARGÅTE geschrieben hat das ich irgendwo ein .d vergessen hab und einen Double Wert in eine long rein quetsche da der fehler ja nur in der 32 bit version vorkommt. Ich muß da nochmal drüber schauen ob ich was finden kann und melde mich dann wieder. Bis dahin aber schonmal vielen Dank euch beiden :allright:
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Probleme mit Doubles

Beitrag von ts-soft »

captain_hesse hat geschrieben:das ich irgendwo ein .d vergessen hab und einen Double Wert in eine long rein quetsche
Wenn Du EnableExplicit nutzt, sollte dies eigentlich kaum möglich sein :wink:

Einfach die Proceduren in einen leeren Source kopieren und dann mit 32 und 64 bit die Ergebnisse prüfen, dann
solltest Du den Schuldigen schon finden :wink:

Zum testen möglichst hohe Werte (> Long) verwenden.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Re: Probleme mit Doubles

Beitrag von captain_hesse »

ts-soft hat geschrieben:Wenn Du EnableExplicit nutzt, sollte dies eigentlich kaum möglich sein

Einfach die Proceduren in einen leeren Source kopieren und dann mit 32 und 64 bit die Ergebnisse prüfen, dann
solltest Du den Schuldigen schon finden

Zum testen möglichst hohe Werte (> Long) verwenden.
Ok werd ich so machen.
Au man das wird ne Lange Nacht nachträglich EnableExplicit einbauen das bedeutet Arbeit :freak: aber gottseidank haben wir ja Wochenende :) .
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Antworten